首页 > 解决方案 > TypeError: context must be a dict 而不是 HttpResponseRedirect: 不使用 test_func() 真的不可能重定向到 url 吗?

问题描述

我想这样做,如果用户阻止了我或者我已经阻止了用户,我想将他们重定向回主页并且不允许他们查看详细信息页面。因为这是一个基于类的视图,你有什么方法可以让我实现我想要的并且不影响已经存在的东西吗?

我试图做各种事情但没有奏效,我的朋友没有一个可以解决这个问题。我不能直接使用 return redirect(HomeFeed:main) 因为我在同一个视图中有其他上下文,我需要它在模板中返回。

我也不想使用涉及显示 403 禁止错误的 UserMixin 的 test_funct(),因为它对用户不友好,也不会向用户显示到底发生了什么。这就是为什么我想做一个重定向,然后是 django 消息,以告知他们为什么他们无法查看该页面

class DetailBlogPostView(BlogPostMixin,DetailView):
    template_name = 'HomeFeed/detail_blog.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        blog_post=self.get_object()
        blog_post.save()
        context['blog_post'] = blog_post
        account = Account.objects.all()
        context['account'] = account
        if blog_post.interest_set.exists():
            context["interest_pk"]=blog_post.interest_set.first().pk
        
        if blog_post.author in self.request.user.blocked_users.all():
            messages.warning(self.request, 'You cannot view post of ideas authors that you have blocked.', extra_tags='blockedposts')
            hi = redirect('HomeFeed:main')
            context['hi'] = hi
        if blog_post.author in self.request.user.blocked_users.all():
            messages.warning(self.request, 'You cannot view post of ideas authors that have blocked you.', extra_tags='blockeduposts')
            hi = redirect('HomeFeed:main')
            context['bye'] = bye
        return context

标签: djangodjango-modelsdjango-viewsdjango-formsdjango-templates

解决方案


您可以在 get方法中执行此操作:

from django.views.generic import DetailView
from django.shortcuts import redirect

class MyDetailView(DetailView):
    ...

    def get(self, request, *args, **kwargs):
        self.object = blog_post = self.get_object()
        blog_post.save()
        if blog_post.author in request.user.blocked_users.all():
            messages.warning(request, 'You cannot view post of ideas authors that you have blocked.', extra_tags='blockedposts')
            return redirect('HomeFeed:main')
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)
    ...

更新

你的看法:

class DetailBlogPostView(BlogPostMixin,DetailView):
    template_name = 'HomeFeed/detail_blog.html'

    def get(self, request, *args, **kwargs):
        self.object = blog_post = self.get_object()
        blog_post.save()
        if blog_post.author in request.user.blocked_users.all():
            messages.warning(request, 'You cannot view post of ideas authors that you have blocked.', extra_tags='blockedposts')
            return redirect('HomeFeed:main')
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['blog_post'] = self.object
        context['account'] = Account.objects.all()

        if self.object.interest_set.exists():
            context["interest_pk"] = self.object.interest_set.first().pk
        
        return context

推荐阅读