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

Django自定义User模型权限实现及创建超级用户报错求助

问题解决与权限实现指南

一、解决创建超级用户的报错

报错核心原因:自定义User模型未定义is_staff和is_superuser字段,但create_superuser方法自动为这两个字段赋值,导致实例化User时出现未知参数错误。

修改步骤:

  1. 更新models.py,补充权限基础
    Django权限系统依赖PermissionsMixin类,它会自动提供is_superuser字段及权限管理方法;is_staff字段需手动添加,用于控制用户是否能登录Django后台。另外注意:AbstractBaseUser已内置密码管理逻辑,无需自行定义password字段,否则会与内置方法冲突。

    修改后的models.py代码:

    from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
    from .userManage import UserManager
    
    class User(AbstractBaseUser, PermissionsMixin):
        id = models.AutoField(primary_key=True, null=False)
        name = models.CharField(max_length=100)
        email = models.CharField(max_length=60)
        username = models.CharField(max_length=20, unique=True)
        mobileNumber = models.IntegerField()
        # 添加is_staff字段,控制后台登录权限
        is_staff = models.BooleanField(default=False)
    
        USERNAME_FIELD = 'username'
        # 定义创建用户时必填的额外字段
        REQUIRED_FIELDS = ['name', 'email', 'mobileNumber']
        objects = UserManager()
    
  2. 执行数据库迁移
    修改模型后,运行命令更新数据库:

    python manage.py makemigrations
    python manage.py migrate
    
  3. 重新创建超级用户
    现在执行创建命令即可正常生成超级用户:

    python manage.py createsuperuser
    

二、权限控制实现流程与方法

针对「仅超级用户可执行添加影片、影院等数据库操作」的需求,可通过以下方式实现:

1. 视图层权限校验(核心)

在处理添加操作的视图中,直接校验当前用户是否为超级用户:

方法一:使用装饰器(推荐)

利用Django内置的user_passes_test装饰器快速校验:

from django.contrib.auth.decorators import user_passes_test
from django.http import HttpResponseForbidden

# 定义权限校验逻辑
def is_superuser(user):
    return user.is_authenticated and user.is_superuser

# 为需要控制的视图添加装饰器
@user_passes_test(is_superuser, login_url='/login/')
def add_movie(request):
    # 你的影片添加逻辑
    return HttpResponse("影片添加成功")

@user_passes_test(is_superuser, login_url='/login/')
def add_cinema(request):
    # 你的影院添加逻辑
    return HttpResponse("影院添加成功")

方法二:视图内手动校验

如需更灵活的逻辑处理,可在视图内部判断:

from django.http import HttpResponseForbidden

def add_movie(request):
    if not request.user.is_authenticated or not request.user.is_superuser:
        return HttpResponseForbidden("无权限执行此操作")
    # 你的影片添加逻辑
    return HttpResponse("影片添加成功")

2. 模板层权限控制(可选)

若前端需根据权限显示/隐藏操作按钮,可在模板中判断:

{% if user.is_superuser %}
    <a href="/add_movie/">添加影片</a>
    <a href="/add_cinema/">添加影院</a>
{% endif %}

3. 细粒度权限扩展(可选)

后续若需拆分权限(如允许特定普通用户添加影片),可利用Django权限系统:

  • 为影片/影院模型添加自定义权限:
    class Movie(models.Model):
        # 模型字段...
        class Meta:
            permissions = [
                ("add_movie", "Can add movie"),
            ]
    
  • 给用户分配权限后,在视图中用user.has_perm('app_name.add_movie')校验即可。

内容的提问来源于stack exchange,提问作者Desai Vibha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:43:23