Python 基于Django类的泛型视图重定向

Python 基于Django类的泛型视图重定向,python,django,Python,Django,考虑以下几点: URL.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 re

考虑以下几点:

URL.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/

因此,它显然找到了URL,但表示不匹配?

可能是您应该将名称设置为您的URL模式并重定向到该名称?

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

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

这将重定向到与您的
post()
相同的URL,然后由您的
get()

处理。您应该命名您的URL模式并重定向到该URL,这将是最有效的方法

它没有文档记录(因此不能保证在将来的Django版本中工作),但是
重定向
快捷方式可以使用视图函数,因此您几乎可以执行
重定向(ClassView.as\u view())
…我说几乎是因为这实际上不起作用-每次调用
as\u view()
时,都会返回一个新的视图函数,因此,
redirect
不会将其识别为与您的urlconf中相同的视图

因此,要执行所需操作,必须更新urlconf,如下所示:

from .views import test_view

urlpatterns = patterns('',
    ('^test/$', test_view),
)
在您的视图中

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"),
)


这是一个选项,但如果可能的话,我更愿意重定向到类名。正如alredy用@anentropic回答的那样,可以重定向到预实例化的视图类。但如果你在项目中的其他地方使用它,由于Django不知道哪个urlpattern是正确的,您的重定向可能会被破坏。如果在
post
方法中没有自定义项,那么更干净的方法是使用类似于
Django.views.generic.edit.FormMixin的mixin声明
ClassView
,然后添加
success\u url
类成员声明,
success\u url=reverse\u lazy('test')
。然后你可以完全省略
post
@nmgeek的声明是的,很好的观点。。。虽然OP确实在
post
方法中有
#do some
注释,这表明可能发生了一些定制的事情
class ClassView(View):
    def get(self, request):
        return HttpResponse("test")

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