Django2.0类视图下如何限制特定组用户访问模板部分内容?
解决Django类视图中模板内容按用户组限制的问题
错误原因分析
你遇到的AttributeError: 'bool' object has no attribute 'get'是因为dispatch方法的返回值不符合Django的视图规则:
- Django视图的
dispatch方法必须返回一个HttpResponse(或其子类)对象来响应请求。 - 你现在直接返回了布尔值
in_group,当组内用户访问时,Django会尝试把这个布尔值当作响应对象调用get方法,自然触发了错误。
正确解决方案:通过上下文传递组判断结果
要实现模板中根据用户组显示不同内容,正确的做法是把in_group的判断结果添加到模板上下文里,而非修改dispatch的返回值。我们可以重写get_context_data方法来完成这个操作:
修改你的views.py代码:
class PostListView(ListView): model = BlogPost paginate_by = 10 template_name = 'main/mysite.html' def get_context_data(self, **kwargs): # 先获取父类生成的默认上下文 context = super().get_context_data(**kwargs) # 计算用户是否在目标组,并添加到上下文供模板使用 context['in_group'] = self.request.user.groups.filter(name='GROUP_NAME').exists() return context
你的模板代码无需修改,保持原有的判断逻辑即可:
.... {% if in_group %} <!-- 仅目标组成员可见的内容 --> some code here shows up if user belong to group {% endif %} ....
额外说明
如果之后你需要做整页的权限控制(比如直接拒绝非目标组成员访问页面),可以在dispatch里这样实现:
from django.http import HttpResponseForbidden def dispatch(self, request, *args, **kwargs): if not request.user.groups.filter(name='GROUP_NAME').exists(): # 返回403禁止访问的响应 return HttpResponseForbidden("You don't have permission to access this page.") # 调用父类的dispatch继续处理正常请求流程 return super().dispatch(request, *args, **kwargs)
但这和你当前“仅隐藏模板部分内容”的需求无关,仅供后续参考。
内容的提问来源于stack exchange,提问作者ccsv
相关产品推荐
相关产品推荐

