【问题标题】:TypeError: context must be a dict rather than HttpResponseRedirect: Is it really impossible to redirect to a url without using test_func()?TypeError: context must be a dict 而不是 HttpResponseRedirect: 不使用 test_func() 真的不可能重定向到 url 吗?
【发布时间】:2021-01-23 01:03:00
【问题描述】:

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

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

我也不想使用 UserMixin 的 test_funct(),它会显示 403 Forbidden 错误,因为它对用户不友好,也不会向用户显示到底发生了什么。这就是为什么我想做一个重定向,然后是 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

【问题讨论】:

  • 请编辑标题以使其具有描述性,“困难的 Django”和“紧急”不应该出现在任务标题中。

标签: django django-models django-views django-forms django-templates


【解决方案1】:

您可以在获取method

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

【讨论】:

  • 嗨,基本上我的课上会有两个功能?还是我用 get 替换 get 上下文数据,然后将所有代码转换为 get?
  • 通过将您的代码添加到我现有的代码中,似乎块系统可以工作,但我的其他代码的其余部分没有,因为现在我的其他上下文出现反向匹配错误
  • 必须是 context["interest_pk" ] = self.object.interest_set.first().pk
猜你喜欢
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2018-10-29
相关资源
最近更新 更多