Этот вопрос, кажется, для более старых версий 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)