8

这是我如何为通用视图 object_detail 使用反向的问题?

如果我像下面这样使用它,错误消息将是: NoReverseMatch at /comment/add/ Reverse for '' with arguments '()' and keyword arguments '{}' not found。

在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),
    )
4

3 回答 3

18

在通用视图中使用反向的唯一方法 -命名 urls配置。

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',))
于 2009-04-03T08:21:10.357 回答
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)
于 2012-12-06T15:14:21.737 回答
0

我找到了最好的解决方案,使用 reverse_lazy():

https://docs.djangoproject.com/en/1.5/ref/urlresolvers/#reverse-lazy

于 2014-04-02T02:46:07.487 回答