2014-01-28 5 views
3

Рассмотрим следующий пример:Django класса на основе общий вид перенаправления

urls.py:

urlpatterns = patterns('', 
    ('^test/$', ClassView.as_view()), 
) 

views.py:

class ClassView(View): 
    def get(self, request): 
     return HttpResponse("test") 
    def post(self, request): 
     # do something 
     return redirect(ClassView.get(request)) # What should I do to redirect to a class here without specifying the path? 

Я хочу, чтобы перенаправить функции ПОЛУЧИТЬ ClassView в (/ испытание /), но когда я попытаюсь это сделать, я получаю:

NoReverseMatch at /test/ 

Значит, он явно находит URL-адрес, но говорит, что нет совпадения?

ответ

5

Вы должны просто назвать свой urlpattern и перенаправить на это, что было бы самым удобным способом Django-ey.

Это не документировано (так не гарантировано работать в будущих версиях Django), но метод redirect ярлык может принять функцию просмотра, так что вы можете почти сделать redirect(ClassView.as_view()) ... Я говорю почти, потому что это на самом деле не работает - каждый раз, когда вы вызываете as_view(), вы получаете новую функцию возврата, поэтому redirect не признает это как тот же вид, что и в вашем urlconf.

Так делать то, что вы хотите, вы должны обновить URLconf так:

from .views import test_view 

urlpatterns = patterns('', 
    ('^test/$', test_view), 
) 

И в вашем views.py

class ClassView(View): 
    def get(self, request): 
     return HttpResponse("test") 

    def post(self, request): 
     # do something 
     return redirect(test_view) 

test_view = ClassView.as_view() 

Но я все еще думаю, что вы должны сделать это другой путь:

urlpatterns = patterns('', 
    url('^test/$', ClassView.as_view(), name="test"), 
) 

.

class ClassView(View): 
    def get(self, request): 
     return HttpResponse("test") 

    def post(self, request): 
     # do something 
     return redirect("test") 
+0

Если в методе 'post' нет ничего обычая, тогда более чистый способ сделать это - объявить' ClassView' с помощью mixin, например 'django.views.generic.edit.FormMixin', а затем добавить объявление члена класса' success_url', 'success_url = reverse_lazy ('test')'. Тогда вы можете полностью опустить объявление 'post'. – nmgeek

+0

@nmgeek да, хорошая точка! ... хотя OP действительно имел комментарий '# do something' в методе' post', который предполагает, что, возможно, произошел какой-то обычай – Anentropic

1

Может быть, вы должны указать имя своего URL-адреса и перенаправить на это имя?

+0

Это один из вариантов, но я предпочел бы просто перенаправить к имени класса, если это возможно. – olofom

+0

Как alredy ответил @anentropic, можно перенаправить на предварительно созданный класс представления. Но если вы используете его где-то еще в проекте, вы можете перенаправить его, потому что Django не знает, какой URL-адрес правильный. – oxyum

0

Попробуйте вернуться self.get(). Я не тестировал. Но как его код python, он должен работать. Используйте это, если вы хотите выполнять только инструкции. Я думаю, что это не вернет статус HTTP 302.

0
def post(self, request, *args, **kwargs): 
    return HttpResponseRedirect(request.path) 

Это будет перенаправлять на тот же URL, как ваш post(), а затем получить обрабатывается вашим get().

Смежные вопросы