8

ジェネリックビューobject_detailにreverseを使用するにはどうすればよいですか?

次のように使用すると、エラーメッセージは次のようになります。引数'()'およびキーワード引数'{}'が見つからない''の/comment / add/Reverseでの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),
    )
4

3 に答える 3

18

汎用ビューでリバースを使用する唯一の方法 -名前付きの 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',))
于 2009-04-03T08:21:10.357 に答える
4

この質問は、古いバージョンのDjangoに関するもののようです。古い汎用ビューがどのように機能するのかよくわかりません。しかし、新しいクラスベースのジェネリックビューにも同じ問題があります。

View.as_view()は毎回異なるラッパー関数を返し、それらは互いに等しく比較されないため、リバースは「箱から出して」機能しません。そのため、reverse()は2つを比較してリバースルートを見つけることができません。等しくない関数。

非標準ですが、別の方法があります。これは、クラスベースのビューに対して行うことです。

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 に答える