在 Django 管理中禁用选择列表,仅用于编辑

Disable choice list in Django admin, only for editing

我想在编辑对象时禁用某些字段。我已经设法为文本字段执行此操作,但对于下拉列表(选择列表)是不可能的。

我正在窗体的构造函数中执行此操作。

class OrderModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(forms.ModelForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            self.fields['description'].widget.attrs['readonly'] = True
            self.fields['city_code'].widget.attrs['disabled'] = True

请注意我是如何使用不同的 关键字 为两者制作的,但我无法为我的 customer_id 字段制作。

将属性设置为 disabledreadonly 只会影响小部件的显示方式。它实际上并没有阻止某人提交更改这些字段的 post 请求。

为您的模型覆盖 get_readonly_fields 可能是更好的方法。

class OrderModelAdmin(admin.Model
    def get_readonly_fields(self, request, obj=None):
        if self.obj.pk:
            return ['description', 'city_code', 'customer']
        else:
            return []

@Alasdair 的回答比这个好(因为这个不阻止提交)。但我 post 它,以防万一有人想要相当于 'readonly' 的 ModelChoiceField

self.fields['customer_id'].widget.widget.attrs['disabled'] = 'disabled'

注意,ChoiceField 就足够了,像这样:

self.fields['city_code'].widget.attrs['disabled'] = True