Comment obtenir une URL inverse pour une vue générique?
Question
Voici la question de savoir comment puis-je utiliser pour inverser la vue générique object_detail?
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.
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),
)
La solution
La seule façon d'utiliser inverse avec des vues génériques - urls nommé 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',))
Autres conseils
Cette question semble être pour les anciennes versions de Django. Je ne suis pas au courant de la façon dont les anciens travaillent vues génériques. Mais les nouvelles vues génériques basés sur les classes ont le même problème.
Inverser ne fonctionne pas « hors de la boîte », car View.as_view () retourne une fonction d'emballage différent à chaque fois, et ils ne se comparent pas égaux entre eux, donc inverse () ne peut pas trouver le chemin inverse en comparant les deux fonctions qui ne sont pas égaux.
Il y a une autre façon, même si elle est non standard. C'est ce que je fais pour mon point de vue basés sur les classes:
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 passez des arguments à as_view()
, l'emballage, il retourne sera effectivement différent de celui ordinaire. 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 lier à 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 le point de vue des attributs:
def get_success_url(self):
return reverse(OrderView.plain_view)
def get_failure_url(self):
return reverse(OrderView.bonk_view)
J'ai trouvé la meilleure solution, l'utilisation reverse_lazy ():
https://docs.djangoproject.com/en/1.5 / ref / urlresolvers / # inverse paresseux