Django中能否添加用户过滤按钮,按用户角色/用户名限制导航栏链接可见性
Django导航栏权限控制方案
首先明确结论:两种方式需要搭配使用——可以直接在Base.html中控制标签的可见性,同时必须在对应跳转页面的渲染逻辑中加权限校验,避免越权访问。
1. 模板侧控制导航链接可见性的实现
Django默认会将request.user对象注入到所有使用RequestContext渲染的模板中,不需要每个子页面单独传递用户参数,刚好适配Base.html全局复用的场景:
- 基于用户名控制可见性写法:
{% if request.user.username == 'admin' %} <a href="/system-manage/">系统管理入口</a> {% endif %}
- 基于用户角色/权限控制可见性:
- 用Django内置权限体系的写法:
{% if perms.myapp.view_data %} <a href="/data-list/">数据列表入口</a> {% endif %}- 自定义User模型扩展了role字段的写法:
{% if request.user.role == 'editor' %} <a href="/content-edit/">内容编辑入口</a> {% endif %}
2. 视图侧权限校验的实现
模板侧的可见性控制只是隐藏了链接,用户如果手动输入对应URL仍然可以访问,因此必须在对应视图层加权限校验:
- 函数视图用装饰器控制:
from django.contrib.auth.decorators import permission_required @permission_required('myapp.view_data', raise_exception=True) def data_list(request): # 视图业务逻辑 ...
- 类视图用Mixin控制:
from django.contrib.auth.mixins import PermissionRequiredMixin from django.views.generic import ListView class DataListView(PermissionRequiredMixin, ListView): permission_required = 'myapp.view_data' model = DataModel
3. 注意事项
如果你的项目配置了模板缓存,且缓存了Base.html的导航栏部分,需要对缓存做用户权限维度的分片,避免不同权限的用户拿到相同的缓存导航栏,出现权限显示异常。
内容的提问来源于stack exchange,提问作者KyleStranger
相关产品推荐
相关产品推荐

