Django 如何获取通用视图的反向URL?
这里有一个问题,我如何对常规视图对象_细节使用reverse 如果我像下面那样使用它,错误消息将是: NoReverseMatch at/comment/add/ 找不到参数为“()”且关键字参数为“{}”的“”的反转 在views.py中:Django 如何获取通用视图的反向URL?,django,reverse,Django,Reverse,这里有一个问题,我如何对常规视图对象_细节使用reverse 如果我像下面那样使用它,错误消息将是: NoReverseMatch at/comment/add/ 找不到参数为“()”且关键字参数为“{}”的“”的反转 在views.py中: urlresolvers.reverse('django.views.generic.list_detail.object_detail') return HttpResponseRedirect(resp) 在URL.py中
urlresolvers.reverse('django.views.generic.list_detail.object_detail')
return HttpResponseRedirect(resp)
在URL.py中
common_info_dict = {
'extra_context':{
'blogtitle':"Thinking",
'blogsubtitle':"- blog system",
'articles_count':Entry.objects.count,
'comments_count': 0,
'visitors_count' : 0,
'category_list':Category.objects.all,
'tag_list':Tag.objects.all,
'comment_form': CommentForm,
},
}
object_detail_info_dict = {
'queryset': Entry.objects.all(),
'slug_field': 'slug',
'template_object_name': 'post',
}
object_detail_info_dict.update(common_info_dict)
urlpatterns += patterns('django.views.generic.list_detail',
(r'^posts/(?P<slug>[-\w]+)/$', 'object_detail', object_detail_info_dict),
)
common\u info\u dict={
“额外上下文”:{
“博客标题”:“思考”,
'博客字幕':“-博客系统”,
“项目计数”:Entry.objects.count,
“注释计数”:0,
“访客计数”:0,
“类别列表”:category.objects.all,
“标记列表”:tag.objects.all,
“注释形式”:注释形式,
},
}
对象\详细信息\信息\指令={
'queryset':Entry.objects.all(),
“slug_字段”:“slug”,
“模板对象名称”:“发布”,
}
对象详细信息目录更新(通用信息目录)
urlpatterns+=模式('django.views.generic.list_detail',
(r“^posts/(?P[-\w]+)/$”,“对象详细信息”,对象详细信息,
)
在常规视图中使用reverse的唯一方法-配置
urlpatterns+=patterns('django.views.generic.list_detail',
(r“^posts/(?P[-\w]+)/$”,“对象详细信息”,
对象“详细信息”命令“发布详细信息”),
)
反向('post_detail',args=('foobar',))
这个问题似乎适用于Django的旧版本。我不熟悉旧的通用视图是如何工作的。但是新的基于类的泛型视图也有同样的问题
反转“开箱即用”不起作用,因为View.as_View()每次返回不同的包装函数,并且它们之间的比较不相等,所以reverse()无法通过比较两个不相等的函数来找到反转路径
还有另一种方法,尽管它是非标准的。这是我为基于类的视图所做的:
class OrderView(LoginRequiredMixin, CreateView):
model = Order
form_class = OrderForm
OrderView.plain_view = staticmethod(OrderView.as_view())
在本例中,我使用plain\u view
表示as\u view()
返回的没有参数的视图。如果将参数作为_view()传递给,那么它返回的包装器实际上与普通包装器不同。因此,如果两者都需要,则必须将它们指定给不同的属性:
OrderView.plain_view = staticmethod(OrderView.as_view())
OrderView.bonk_view = staticmethod(OrderView.as_view(whee='bonk'))
您可以在url.py
中链接到这些视图属性:
urlpatterns = patterns('',
url(r'^order/$', views.OrderView.plain_view),
url(r'^frob/$', views.OrderView.bonk_view),
然后可以通过反转视图属性来反转它们:
def get_success_url(self):
return reverse(OrderView.plain_view)
def get_failure_url(self):
return reverse(OrderView.bonk_view)
我找到了最好的解决方案,使用reverse_lazy():
这个答案说明了问题的本质,它更好。
def get_success_url(self):
return reverse(OrderView.plain_view)
def get_failure_url(self):
return reverse(OrderView.bonk_view)