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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:42:53