在 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
字段制作。
将属性设置为 disabled
或 readonly
只会影响小部件的显示方式。它实际上并没有阻止某人提交更改这些字段的 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
我想在编辑对象时禁用某些字段。我已经设法为文本字段执行此操作,但对于下拉列表(选择列表)是不可能的。
我正在窗体的构造函数中执行此操作。
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
字段制作。
将属性设置为 disabled
或 readonly
只会影响小部件的显示方式。它实际上并没有阻止某人提交更改这些字段的 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