2009-04-03 22 views
8

Hier ist die Frage, wie verwende ich Reverse für die generische Ansicht object_detail?Wie bekomme ich eine umgekehrte URL für eine generische Ansicht?

Wenn ich es wie die folgenden verwenden, wird die Fehlermeldung sein: NoReverseMatch at/Kommentar/add/ umge für ‚‘ mit den Argumenten ‚()‘ und Keyword-Argumente ‚{}‘ nicht gefunden.

in views.py:

urlresolvers.reverse('django.views.generic.list_detail.object_detail') 
       return HttpResponseRedirect(resp) 

in 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), 
    ) 

Antwort

18

Der einzige Weg zu umkehren mit generischen Ansichten zu verwenden - named urls Konfig.

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',)) 
3

Diese Frage scheint für ältere Versionen von Django zu sein. Ich weiß nicht, wie die alten generischen Ansichten funktionieren. Aber die neuen klassenbasierten allgemeinen Ansichten haben das gleiche Problem.

Das Umkehren funktioniert nicht "out of the box", weil View.as_view() jedes Mal eine andere Wrapperfunktion zurückgibt und sie nicht gleich miteinander vergleichen, also kann reverse() das Gegenteil nicht finden Route durch Vergleich zweier Funktionen, die nicht gleich sind.

Es gibt einen anderen Weg, obwohl es nicht Standard ist. Dies ist, was ich für meine klassenbasierte Ansichten:

class OrderView(LoginRequiredMixin, CreateView): 
    model = Order 
    form_class = OrderForm 

OrderView.plain_view = staticmethod(OrderView.as_view()) 

In diesem Fall verwende ich plain_view die Ansicht von as_view() ohne Argumente zurück bedeuten. Wenn Sie Argumente an as_view() übergeben, wird sich der Wrapper, der zurückgegeben wird, tatsächlich von dem einfachen unterscheiden. Also, wenn Sie beide brauchen, würden Sie sie auf verschiedene Eigenschaften zuweisen müssen:

OrderView.plain_view = staticmethod(OrderView.as_view()) 
OrderView.bonk_view = staticmethod(OrderView.as_view(whee='bonk')) 

Sie auf diese Ansicht verknüpfen können Attribute in urls.py:

urlpatterns = patterns('', 
    url(r'^order/$', views.OrderView.plain_view), 
    url(r'^frob/$', views.OrderView.bonk_view), 

und dann können Sie sie rückgängig machen, indem die Umkehrung Ansicht Attribute:

def get_success_url(self): 
    return reverse(OrderView.plain_view) 

def get_failure_url(self): 
    return reverse(OrderView.bonk_view) 
+0

Diese Antwort sagen das Wesen des Problems, es ist besser. – dspjm

Verwandte Themen