下面是怎么用反向的通用视图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 /#反向懒惰

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top