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