如何在Django中为用户分配权限?ERP项目权限配置需求
Django ERP多角色用户权限管理实现方案
针对你的需求,这里给出一套基于Django原生权限系统的落地方案,支持在Admin后台为不同用户(管理员/经理/普通用户)单独分配查看、编辑、删除、CSV下载权限,且能直接通过复选框可视化配置。
1. 扩展用户模型与自定义权限
首先扩展默认用户模型(可选,用于快速区分角色),同时定义专属权限:
# models.py from django.contrib.auth.models import AbstractUser, Permission from django.db import models class CustomUser(AbstractUser): ROLE_CHOICES = ( ('admin', '管理员'), ('manager', '经理'), ('user', '普通用户'), ) role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='user') class Meta: # 自定义权限,执行migrate后自动同步到数据库 permissions = [ ('view_data', '查看数据'), ('edit_data', '编辑数据'), ('delete_data', '删除数据'), ('download_csv', '下载CSV文件'), ]
执行python manage.py makemigrations和migrate,将自定义权限同步到数据库。
2. 配置Admin后台,添加可视化权限配置页
修改Admin配置,让用户详情页显示自定义权限的复选框组,方便直接勾选配置:
# admin.py from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django import forms from .models import CustomUser class CustomUserPermissionForm(forms.ModelForm): # 提取自定义权限,用复选框组展示 custom_data_permissions = forms.ModelMultipleChoiceField( queryset=Permission.objects.filter(content_type__app_label='your_app_name'), widget=forms.CheckboxSelectMultiple, label='数据权限配置', required=False ) class Meta: model = CustomUser fields = '__all__' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 初始化已选中的权限 if self.instance.pk: self.fields['custom_data_permissions'].initial = self.instance.user_permissions.filter( content_type__app_label='your_app_name' ) def save(self, commit=True): user = super().save(commit=False) if commit: user.save() # 更新用户权限集合 user.user_permissions.set(self.cleaned_data['custom_data_permissions']) return user class CustomUserAdmin(UserAdmin): form = CustomUserPermissionForm # 将权限配置块加入用户详情页 fieldsets = UserAdmin.fieldsets + ( ('权限配置', {'fields': ('custom_data_permissions',)}), ) admin.site.register(CustomUser, CustomUserAdmin)
替换your_app_name为你的实际应用名称,之后在Admin的用户编辑页就能看到专门的权限配置区域,直接勾选即可完成权限分配。
3. 视图层权限校验
在各个仪表盘、数据操作视图中,用Django自带装饰器校验权限:
# views.py from django.contrib.auth.decorators import permission_required from django.shortcuts import render from django.http import HttpResponse import csv # 普通用户仪表盘:需查看权限 @permission_required('your_app.view_data', raise_exception=True) def user_dashboard(request): # 仪表盘业务逻辑 return render(request, 'dashboard/user.html') # 数据编辑视图:需编辑权限 @permission_required('your_app.edit_data', raise_exception=True) def edit_data(request, pk): # 数据编辑逻辑 return render(request, 'data/edit.html') # CSV下载视图:需下载权限 @permission_required('your_app.download_csv', raise_exception=True) def download_csv(request): # CSV生成逻辑 response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="erp_data.csv"' writer = csv.writer(response) writer.writerow(['ID', '名称', '数量']) # 追加业务数据... return response
无对应权限的用户访问时,会直接返回403页面,也可自定义异常处理逻辑。
4. 模板层控制元素显示
在仪表盘模板中,根据用户权限动态显示/隐藏操作按钮:
<!-- dashboard/user.html --> {% if user.has_perm 'your_app.edit_data' %} <button class="btn btn-primary" onclick="location.href='{% url 'edit_data' %}'">编辑数据</button> {% endif %} {% if user.has_perm 'your_app.download_csv' %} <a href="{% url 'download_csv' %}" class="btn btn-success">下载CSV报表</a> {% endif %}
不同权限的用户会自动看到匹配的操作选项。
补充说明
- 若需批量给某类角色配置权限,可使用Django的
Group模型:先创建管理员/经理组并分配权限,再将用户加入对应组,减少重复操作。 - 所有权限校验基于本地数据库,完全适配你的登录体系需求。
内容的提问来源于stack exchange,提问作者vvn
相关产品推荐
相关产品推荐

