Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django class based generic view redirect

Tags:

python

django

Consider the following:

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?

I want to redirect to ClassView's get function (/test/), but when I try the above I get:

NoReverseMatch at /test/

So it obviously finds the URL but says that there's no match?

like image 285
olofom Avatar asked Jan 28 '14 14:01

olofom


2 Answers

You should just name your urlpattern and redirect to that, that would be the most Django-ey way to do it.

It's not documented (so not guaranteed to work in future Django versions) but the redirect shortcut method can take a view function, so you can almost do redirect(ClassView.as_view()) ...I say almost because this doesn't actually work - every time you call as_view() you get a new view function returned, so redirect doesn't recognise that as the same view as in your urlconf.

So to do what you want, you'd have to update your urlconf like so:

from .views import test_view

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

And in your 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()

But I still think you should do it the other way:

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")
like image 180
Anentropic Avatar answered Sep 23 '22 05:09

Anentropic


May be you should set name to your urlpattern and redirect to that name?

like image 41
oxyum Avatar answered Sep 23 '22 05:09

oxyum