我有一个如下所示的网址映射:
url(r'^(?P<lang>[a-z][a-z])/$', MyTemplateView.as_view()),
我接受的lang
捕获组只有几个值,即:(1)ro
和(2)en
。如果用户输入http://server/app/fr/
,我想将其重定向到默认http://server/app/en/
。
我怎么能这样做,因为MyTemplateView
只有一个预期返回字典的方法?
def get_context_data(self, **kwargs):
return { 'foo': 'blah' }
答案 0 :(得分:34)
我知道这个问题很老,但我自己就是这样做的。您可能认为要在get_context_data
中执行此操作的原因是业务逻辑,但您应将其放在dispatch
中。
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated():
return redirect('home')
return super(MyTemplateView, self).dispatch(request, *args, **kwargs)
将您的业务逻辑保留在dispatch
中,您应该是金色的。
答案 1 :(得分:12)
为什么只有get_context_data
?
如果需要,只需设置get
处理程序即可进行重定向。
def get(self, request, lang):
if lang == 'fr':
return http.HttpResponseRedirect('../en')
return super(MyTemplateView, self).get(request, lang)
答案 2 :(得分:1)
将来的说明:仅使用RedirectView
就可以,而且可能更简单。
答案 3 :(得分:0)
使用 Django 3.1 中的 UpdateView
类对我有用:
def get(self, request, *args, **kwargs):
if 1 == 1:
return HttpResponseRedirect(reverse_lazy("view_name_here"))
else:
return super().get(request, *args, **kwargs)
为了确定这一点,我分析了它的基类(PyCharm 中的 Cmd+Click),在那里我找到了基方法:
def get(self, request, *args, **kwargs):
self.object = self.get_object()
return super().get(request, *args, **kwargs)
您可以在 Django 源代码中找到这个和其他方法:django/views/generic/edit.py