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),
    )
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top