首页 > 解决方案 > HttpResponseRedirect 在 Django 中不起作用

问题描述

HttpResponseRedirect 不起作用它显示错误,因为“上下文必须是 dict 而不是响应”

class FooterLinksView(TemplateView):
    template_name = 'pages/footerlinks.html'
    model = FooterLink

    def get_context_data(self, **kwargs):

        context = super(FooterLinksView,self).get_context_data(**kwargs)
        string_name = self.kwargs['string']
        obj = FooterLink.objects.get(link_url=string_name)

        if obj.link_type == 'page':
            try:
                context['page_obj'] = obj
                return context
            except:
                pass
        else:
            pass
            print(obj.url_name)
            return HttpResponseRedirect(str(obj.url_name))

标签: pythondjangohttpresponse

解决方案


get_context_data()是返回上下文的方法,所以它必须返回context对象。如果要重定向,请在get().

像下面

类 FooterLinksView(TemplateView): template_name = 'pages/footerlinks.html' model = FooterLink

def get(self, request, *args, **kwargs):
    string_name = self.kwargs['string']
    obj = FooterLink.objects.get(link_url=string_name)

    if obj.link_type != 'page':
        return HttpResponseRedirect(str(obj.url_name))
    else:
        return super().get(*args, **kwargs)
        # if python2
        # return super(FooterLinksView, self).get(*args, **kwargs)

def get_context_data(self, **kwargs):

    context = super(FooterLinksView,self).get_context_data(**kwargs)
    string_name = self.kwargs['string']
    obj = FooterLink.objects.get(link_url=string_name)

    if obj.link_type == 'page':
        try:
            context['page_obj'] = obj
            return context
        except:
            pass
    return context

或者你可以只使用extra_contextin TemplateView

类 FooterLinksView(TemplateView): template_name = 'pages/footerlinks.html' model = FooterLink

def get(self, request, *args, **kwargs):
    string_name = self.kwargs['string']
    obj = FooterLink.objects.get(link_url=string_name)

    if obj.link_type != 'page':
        try:
            self.extra_context = {
                'page_obj': obj
            }
        except:
            pass
        return HttpResponseRedirect(str(obj.url_name))
    else:
        return super().get(*args, **kwargs)
        # if python2
        # return super(FooterLinksView, self).get(*args, **kwargs)

推荐阅读