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

Django配置Model默认权限后新用户未生效问题及方案问询

你在模型Meta类中配置default_permissions的写法本身没有错误,你遇到新用户没有权限的问题,是因为你误解了这个配置的作用:
default_permissions的作用是定义Django迁移时为该模型自动生成哪些权限项,Django默认的default_permissions本来就是('add', 'change', 'delete', 'view'),如果没有特殊需求这行配置其实可以省略。这个配置并不会自动给新注册的用户分配权限,权限需要手动关联到用户或者用户组,这就是你一开始新用户登录后台看不到对应权限的原因。

你现在手动给用户绑定权限的解决方法是可行的,但硬编码权限codename的方式扩展性较差,后续新增模型时需要手动修改权限列表,可以选择以下更简便的方案:

方案一:通过用户组统一管理权限(最推荐)

提前在Django后台创建一个普通用户组,给该组分配好所有需要的权限,新用户注册完成后直接加入该组即可。后续如果需要调整所有普通用户的权限,只需要修改用户组的权限,不需要修改代码:

from django.contrib.auth.models import Group

# 提前创建好的普通用户组,名称可自定义
default_user_group = Group.objects.get(name='普通用户')
user.groups.add(default_user_group)

方案二:动态批量获取模型权限

如果不想使用用户组,也可以动态获取指定模型的所有权限,不需要逐个硬编码权限codename:

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
# 导入你需要分配权限的模型
from your_app.models import Depot, Courier, Client

# 批量获取三个模型的所有默认权限
required_permissions = Permission.objects.filter(
    content_type__in = [
        ContentType.objects.get_for_model(Depot),
        ContentType.objects.get_for_model(Courier),
        ContentType.objects.get_for_model(Client)
    ]
)
user.user_permissions.add(*required_permissions)

如果需要给项目所有模型都分配权限,还可以进一步简化filter的查询条件,不需要逐个指定模型。

额外优化建议

可以将权限分配逻辑放到Django的post_save信号中,监听User模型的创建事件,和注册表单逻辑解耦,不管是后台创建还是前台注册的用户,都会自动分配默认权限。生产环境建议按需分配权限,不要默认给所有普通用户开放delete、change等高风险操作权限。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:36:05