Django Admin中如何让只读字段与可编辑字段保持原有顺序?
解决Django Admin只读字段保留原排序的方案
方案一:通过fieldsets指定字段顺序
默认情况下,readonly_fields中的字段会被Django Admin自动移到页面底部。要保留原有字段排序,最直接的方式是使用fieldsets明确定义所有字段的排列顺序,将只读字段放在原本的位置,同时在readonly_fields中声明这些字段。
示例代码:
from django.contrib import admin from .models import YourModel class YourModelAdmin(admin.ModelAdmin): fieldsets = ( (None, { 'fields': ('normal_field1', 'readonly_field', 'normal_field2'), }), ) readonly_fields = ['readonly_field'] admin.site.register(YourModel, YourModelAdmin)
设置后,readonly_field会按照fieldsets中指定的位置显示,不会被移到底部。
方案二:自定义ModelForm实现字段只读
如果不想使用fieldsets,可以通过自定义ModelForm,将需要只读的字段设置为readonly或disabled属性,这样字段会保留原有排序,同时无法被编辑。
示例代码:
from django import forms from django.contrib import admin from .models import YourModel class YourModelForm(forms.ModelForm): class Meta: model = YourModel fields = ('normal_field1', 'readonly_field', 'normal_field2') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 仅在修改页面设置只读(若新增页面也需要,移除if判断即可) if self.instance.pk: # readonly属性:用户无法编辑,但表单提交时仍会传递该字段值 self.fields['readonly_field'].widget.attrs['readonly'] = True # disabled属性:更彻底的只读,表单提交时不会传递该字段值,Django会忽略该字段的修改请求 # self.fields['readonly_field'].widget.attrs['disabled'] = True class YourModelAdmin(admin.ModelAdmin): form = YourModelForm admin.site.register(YourModel, YourModelAdmin)
补充说明
fieldsets是Django官方推荐的布局方式,适合需要统一管理页面字段顺序的场景;- 自定义ModelForm的方式更灵活,支持针对新增、修改等不同场景设置只读规则;
- 使用
disabled属性比readonly更安全,避免表单提交时意外修改字段值。
内容的提问来源于stack exchange,提问作者Klaas van Schelven
相关产品推荐
相关产品推荐

