Как получить обратный URL для общего вида? - PullRequest
8 голосов
/ 03 апреля 2009

Вот вопрос, как мне использовать реверс для общего представления object_detail?

Если я использую его следующим образом, сообщение об ошибке будет: 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),
    )

Ответы [ 3 ]

18 голосов
/ 03 апреля 2009

Единственный способ использовать реверс с общими представлениями - 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',))
4 голосов
/ 06 декабря 2012

Этот вопрос, кажется, для более старых версий Django. Я не знаком с тем, как работают старые общие представления. Но у новых базовых представлений на основе классов есть та же проблема.

Реверс не работает "из коробки", потому что View.as_view () каждый раз возвращает разные функции-обертки, и они не сравниваются равными друг другу, поэтому reverse () не может найти обратный маршрут сравнивая две функции, которые не равны.

Есть другой способ, хотя он нестандартный. Вот что я делаю для своих представлений на основе классов:

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)
0 голосов
/ 02 апреля 2014

Я нашел лучшее решение, используйте reverse_lazy ():

https://docs.djangoproject.com/en/1.5/ref/urlresolvers/#reverse-lazy

...