我可以重定向到django TemplateView中的另一个URL吗?

时间:2011-10-25 04:36:44

标签: django django-views

我有一个如下所示的网址映射:

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' }

4 个答案:

答案 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