题
下面是怎么用反向的通用视图object_detail并问题?
如果我使用它像下文中,错误消息将是: NoReverseMatch在/评论/添加/ 反向为“”与参数“()”和关键字参数“{}”未找到。
在views.py:
urlresolvers.reverse('django.views.generic.list_detail.object_detail')
return HttpResponseRedirect(resp)
在urls.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),
)
解决方案
使用具有通用视图扭转的唯一方法 - 命名网址配置。
urlpatterns += patterns('django.views.generic.list_detail',
(r'^posts/(?P<slug>[-\w]+)/$', 'object_detail',
object_detail_info_dict, 'post_detail'),
)
reverse('post_detail', args=('foobar',))
其他提示
此问题似乎是旧版本的Django的。我不熟悉的老通用视图是如何工作的。但是,新的基于类的通用视图有同样的问题。
倒车不起作用“开箱即用”,因为View.as_view()返回每次一个不同的包装函数,并且它们不比较彼此相等,所以反向()找不到反向路由通过比较两个函数是不相等的。
还有另一种方法,虽然它的非标。这是我为我的基于类的意见做:
class OrderView(LoginRequiredMixin, CreateView):
model = Order
form_class = OrderForm
OrderView.plain_view = staticmethod(OrderView.as_view())
在这种情况下,我使用plain_view
为是指通过as_view()
不带参数返回的视图。如果您将参数传递给as_view()
,则返回包装实际上是平原不同。所以,如果你需要同时,你必须将它们分配到不同的属性:
OrderView.plain_view = staticmethod(OrderView.as_view())
OrderView.bonk_view = staticmethod(OrderView.as_view(whee='bonk'))
可以链接到这些视图在属性urls.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():
https://docs.djangoproject.com/en/1.5 / REF / urlresolvers /#反向懒惰
不隶属于 StackOverflow