以下是如何对通用视图object_detail使用reverse的问题?
如果我像下面这样使用它,错误信息将是: NoReverseMatch at / comment / add / 反向''带参数'()'和关键字参数'{}'找不到。
在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),
)
答案 0 :(得分:18)
使用反向通用视图的唯一方法 - named urls config。
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',))
答案 1 :(得分:4)
这个问题似乎适用于旧版本的Django。我不熟悉旧的通用视图如何工作。但是新的基于类的通用视图也存在同样的问题。
反转不能“开箱即用”,因为View.as_view()每次返回一个不同的包装函数,并且它们彼此不相等,所以reverse()找不到反向路径通过比较两个不相等的函数。
还有另一种方式,虽然它不标准。这就是我为基于类的视图所做的事情:
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)
答案 2 :(得分:0)
我找到了最佳解决方案,请使用reverse_lazy():
https://docs.djangoproject.com/en/1.5/ref/urlresolvers/#reverse-lazy