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

时间:2015-11-10 18:05:38

标签: python django django-forms django-1.8

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

我正在表单的构造函数中执行此操作。

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字段执行此操作。

2 个答案:

答案 0 :(得分:2)

将属性设置为disabledreadonly只会影响窗口小部件的显示方式。它并没有真正阻止某人提交更改这些字段的帖子请求。

为您的模型覆盖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 []

答案 1 :(得分:1)

@Alasdair的答案比这个更好(因为这个没有阻止提交)。但我发布它,以防万一有人想要等同于' readonly' ModelChoiceField

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

请注意,ChoiceField的内容应该是这样的:

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