2009-04-03 6 views
8

Voici la question comment utiliser reverse pour la vue générique object_detail?Comment obtenir une URL inversée pour une vue générique?

Si je l'utilise comme ce qui suit, le message d'erreur sera: NoReverseMatch à/commentaire/ajouter/ inverse pour '' avec des arguments '()' et arguments mot-clé '{}' not found.

dans views.py:

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

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

Répondre

18

La seule façon d'utiliser inverse avec des vues génériques - 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',)) 
3

Cette question semble être pour les anciennes versions de Django. Je ne suis pas familier avec le fonctionnement des anciennes vues génériques. Mais les nouvelles vues génériques basées sur les classes ont le même problème.

L'inversion ne fonctionne pas "prête à l'emploi" car View.as_view() renvoie une fonction wrapper différente à chaque fois, et elles ne se comparent pas les unes aux autres, donc reverse() ne trouve pas l'inverse route en comparant deux fonctions qui ne sont pas égales.

Il existe une autre méthode, bien qu'elle ne soit pas standard. C'est ce que je fais pour mon point de vue sur la base de classe:

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

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

Dans ce cas, j'utilise plain_view signifie la vue retournée par as_view() sans argument. Si vous transmettez des arguments à as_view(), l'enveloppe renvoyée sera en fait différente de la plaine. Donc, si vous avez besoin à la fois, il vous faudrait les affecter à des propriétés différentes:

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

Vous pouvez créer un lien vers ces attributs de vue en urls.py:

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

et vous pouvez les inverser en inversant la Voir les attributs:

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

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

Cette réponse dit l'essence du problème, c'est mieux. – dspjm

Questions connexes