You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:22:12