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

时间:2014-01-28 14:50:54

标签: python 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的get函数(/ test /),但是当我尝试上面的时候我得到:

NoReverseMatch at /test/

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

4 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

您可能应该将名称设置为urlpattern并重定向到该名称吗?

答案 2 :(得分:0)

尝试返回self.get()。我没有测试。但作为它的python代码它应该工作。如果您只想执行语句,请使用此选项。这不会返回我认为的任何HTTP 302状态。

答案 3 :(得分:0)

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

这将重定向到与post()相同的网址,然后由get()处理。