基于Django类的通用视图重定向

olo*_*fom 4 python django

考虑以下:

urls.py:

urlpatterns = patterns('',
    ('^test/$', ClassView.as_view()),
)
Run Code Online (Sandbox Code Playgroud)

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?
Run Code Online (Sandbox Code Playgroud)

我想重定向到ClassView的get函数(/ test /),但是当我尝试上面的时候,我得到:

NoReverseMatch at /test/
Run Code Online (Sandbox Code Playgroud)

所以它显然找到了URL但是说没有匹配?

Ane*_*pic 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),
)
Run Code Online (Sandbox Code Playgroud)

在你的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()
Run Code Online (Sandbox Code Playgroud)

但我仍然认为你应该采取另一种方式:

urlpatterns = patterns('',
    url('^test/$', ClassView.as_view(), name="test"),
)
Run Code Online (Sandbox Code Playgroud)

.

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

    def post(self, request):
        # do something
        return redirect("test")
Run Code Online (Sandbox Code Playgroud)