Django自定义User模型权限实现及创建超级用户报错求助
问题解决与权限实现指南
一、解决创建超级用户的报错
报错核心原因:自定义User模型未定义is_staff和is_superuser字段,但create_superuser方法自动为这两个字段赋值,导致实例化User时出现未知参数错误。
修改步骤:
更新
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()执行数据库迁移
修改模型后,运行命令更新数据库:python manage.py makemigrations python manage.py migrate重新创建超级用户
现在执行创建命令即可正常生成超级用户: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
相关产品推荐
相关产品推荐

