django - 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
解决方案
您可以在 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
推荐阅读
- database - 个性化应用中每个用户的授权
- php - 在单独的函数php中获取函数中更新的全局变量的值
- javascript - 在 vscode 中遵循 json 模式引用 ($ref) 链接时转到文件
- javascript - Reactjs 中的 Axios 和 fetch 都在发出持续的 localhost 网络请求
- android - 如何在 lambda 中返回一个变量
- javascript - NODEJS 中大型 Keep-Alive 的副作用是什么
- laravel - 使用 laravel 工厂制作独特的行
- android - 如何修复无法下载 Android 插件组件:layoutlib-resources:检查日志以获取详细信息错误消息(使用 IntelliJ IDE 社区版)
- asp.net-core-mvc - 如何使用 ASP.NET Core MVC (C#) 中的按钮将单选按钮值传递给另一个网页?
- arima - 如何从最好的 auto_arima 模型中提取变量以适应它?