HttpResponseRedirect не работает в Django - PullRequest
0 голосов
/ 26 июня 2018

HttpResponseRedirect не работает, показывает ошибку, так как «контекст должен быть диктом, а не ответом»

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

Ответы [ 4 ]

0 голосов
/ 26 июня 2018
class FooterLinksView(TemplateView):                                
    template_name = 'pages/footerlinks.html'                        
    model = FooterLink                                              

    def get(self, request, args, *kwargs):                        

        context = self.get_context_data(**kwargs)                   
        string_name = self.kwargs['string']                         
        obj = get_object_or_404(FooterLink, link_url=string_name)   

        if obj.link_type == 'page':                                 
           context['page_obj'] = obj                               

           return render(request, self.template_name, context)     
        else:                                                       
            a = obj.url_name                                        
            return HttpResponseRedirect(a)                          
0 голосов
/ 26 июня 2018

get_context_data() - это метод для возвращаемого контекста, поэтому он должен возвращать context объект.Если вы хотите перенаправить, сделайте это в get().

, как показано ниже

class 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_context в 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)
0 голосов
/ 26 июня 2018

Код в get_context_data пытается извлечь отдельный объект и передать его в контекстный словарь.Эта функциональность уже встроена в DetailView и, кажется, лучше подходит здесь, чем TemplateView.

from django.views.generic import DetailView

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

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()

        if self.object.link_type == 'page':
            context = self.get_context_data(object=self.object)
            return self.render_to_response(context)

        return HttpResponseRedirect(str(obj.url_name))

Теперь единственноенам нужно добавить, как объект FooterLink извлекается в методе get_object.Если ваше link_url поле FooterLink является первичным ключом, мы можем просто добавить pk_url_kwarg = 'link_url' в начало класса.В противном случае вы должны использовать slug_field и slug_url_kwarg.

class FooterLinksView(DetailView):
    model = FooterLink
    pk = 'link_url'             # if link_url is the primary key
    slug_field = 'link_url'     # if link_url is not the primary key
    slug_url_kwarg = 'string'   # if link_url is not the primary key
    template_name = 'pages/footerlinks.html'

    ...

Примечание. Теперь вы должны использовать переменную object внутри вашего шаблона (вместо obj) или переопределить еще одну опцию: context_object_name.

0 голосов
/ 26 июня 2018

Вы всегда должны возвращать dict из вашей функции get_context_data.Если вы хотите перенаправить, вы также должны переопределить dispatch:

class FooterLinksView(TemplateView):
    ...
    def dispatch(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))
        return super(FooterLinksView, self).dispatch(request, *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)
        context['page_obj'] = obj
        return context
...