如何获取通用视图的反向URL?

时间:2009-04-03 07:32:02

标签: django reverse

以下是如何对通用视图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),
    )

3 个答案:

答案 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