python - 使用基于类的视图后的POST方法,python Django: 重定向到同一页

我正在制作一个 Django 应用来跟踪电视剧剧集。 这是在某个显示实例上的页面。 当用户点击添加/减去季时我希望页面将它们重定向到相同的详细视图,现在我将它显示在显示所有节目实例列表的索引上

show-detail.html


<form action="{% url 'show:addseason' show=show %}" method="post">


 {% csrf_token %}



 <button class="btn btn-default" type="submit">+</button>


</form> 



<form action="{% url 'show:subtractseason' show=show %}" method="post">


 {% csrf_token %}



 <button class="btn btn-default" type="submit">-</button>


</form>



views.py


class ShowDetail(DetailView):


 model = Show


 slug_field ="title"


 slug_url_kwarg ="show"


 template_name = 'show/show-detail.html'



class AddSeason(UpdateView):


 model = Show


 slug_field = 'title'


 slug_url_kwarg = 'show'


 fields = []



 def form_valid(self, form):


 instance = form.save(commit=False)


 instance.season += 1


 instance.save()



 return redirect('show:index')



class SubtractSeason(UpdateView):


 model = Show


 slug_field = 'title'


 slug_url_kwarg = 'show'


 fields = []



 def form_valid(self, form):


 instance = form.save(commit=False)


 if (instance.season> = 0):


 instance.season -= 1


 else:


 instance.season = 0



 instance.save()



 return redirect('show:index')



urls.py


url(r'^$', views.IndexView.as_view(), name='index'),



url(r'^about/$', views.AboutView.as_view(), name='about'),



# form to add show


url(r'^add/$', views.ShowCreate.as_view(), name='show-add'),



# edit show


#url(r'^(?P<show>[w ]+)/edit/$', views.ShowUpdate.as_view(), name='show-update'),



# delete show


url(r'^(?P<show>[w ]+)/delete/$', views.ShowDelete.as_view(), name='show-delete'),



# signup


url(r'^register/$', views.UserFormView.as_view(), name='register'),



# login


url(r'^login/$', views.LoginView.as_view(), name='login'),



# logout


url(r'^logout/$', views.LogoutView.as_view(), name='logout'),



url(r'^error/$', views.ErrorView.as_view(), name='error'),



url(r'^(?P<show>[w ]+)/$', views.ShowDetail.as_view(), name='show-detail'),



url(r'^(?P<show>[w ]+)/addseason/$', views.AddSeason.as_view(), name='addseason'),



url(r'^(?P<show>[w ]+)/subtractseason/$', views.SubtractSeason.as_view(), name='subtractseason'),



url(r'^(?P<show>[w ]+)/addepisode/$', views.AddEpisode.as_view(), name='addepisode'),



url(r'^(?P<show>[w ]+)/subtractepisode/$', views.SubtractEpisode.as_view(), name='subtractepisode'),



当我尝试时,我得到了一个错误


return redirect('show:detail')



这是错误


NoReverseMatch at/Daredevil/addseason/


Reverse for 'detail' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []



时间:

对于 CBV:


from django.http import HttpResponseRedirect



return HttpResponseRedirect(self.request.path_info)



对于函数视图:


from django.http import HttpResponseRedirect



return HttpResponseRedirect(request.path_info)



重定向到同一页( 比如 , 一个 HTTP GET ) 后,我喜欢...


return HttpResponseRedirect("") # from django.http import HttpResponseRedirect



它还避免了对 show:detail 路由名称进行硬编码,并且是对我至少来说是明智的

我猜你需要提供一个kwarg来识别你重定向的节目,虽然我看不到 DetailView 的代码我会假设kwarg被调用 pk 或者 show 来自你在 AddSeasonSubtractSeason 中使用的约定 。 尝试以下方法:


redirect('show:detail', kwargs={'show': instance.pk})



编辑:细节url的名称是 'show-detail',所以范围的viewname将是 'show:show-detail' ( 如果它位于 show 命名空间中,就像其他url一样) 。 不过我还是觉得需要一个kwarg试试:


redirect('show:show-detail', kwargs={'show': instance.pk})



...