如何设置Django模型字段为只读,即使超级用户也无法编辑
解决方案
你遇到的问题是Django Admin默认不会渲染配置了editable=False的模型字段,只要在Admin注册类中显式配置只读字段列表即可实现「字段可见但不可编辑,超级用户也无法修改」的需求,操作步骤如下:
- 编辑你项目对应app的
admin.py文件,添加如下代码:
from django.contrib import admin from .models import Payments class PaymentsAdmin(admin.ModelAdmin): # 列表页展示的字段,可根据需要调整你想要展示的只读字段 list_display = ('_id', 'user', 'paymentForOrderID', 'totalAmountPaid', 'createdAt') # 配置所有需要展示但不可编辑的字段,Django会自动渲染为只读状态,即便是超级用户提交修改请求也会忽略对应字段的改动 readonly_fields = ('paymentForOrderID', 'aproxTimeAndDateOfPayment', 'totalAmountPaid', 'paymentDetails', 'createdAt', '_id') # 如果你需要自定义详情页的字段排序/分组,把只读字段也加入fields/fieldsets配置即可 fields = ('user', 'paymentMethodUsed', 'paymentForOrderID', 'aproxTimeAndDateOfPayment', 'totalAmountPaid', 'paymentDetails', 'createdAt', '_id') admin.site.register(Payments, PaymentsAdmin)
原理解释
- 模型层的
editable=False配置仅表示该字段默认不加入ModelForm的可写字段列表,Admin默认不会主动渲染这类字段 - 在
readonly_fields中声明的字段,无论模型层是否配置editable=False,都会在Admin详情页展示,且所有用户(包括超级用户)都无法修改,Django后台会自动忽略所有针对这些字段的表单提交修改
内容的提问来源于stack exchange,提问作者user16128694
相关产品推荐
相关产品推荐

