【问题标题】:Disable choice list in Django admin, only for editing在 Django admin 中禁用选择列表,仅用于编辑
【发布时间】:2016-02-11 17:19:50
【问题描述】:

我想在编辑对象时禁用某些字段。我已经设法为文本字段做到这一点,但下拉列表(选择列表)是不可能的。

我在表单的构造函数中做这个动作。

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 字段无法使用。

【问题讨论】:

    标签: python django django-forms django-1.8


    【解决方案1】:

    将属性设置为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 []
    

    【讨论】:

    • 哇!优秀的解决方案。谢谢!
    • 快速,问题,你知道为什么我的只读字段会在表单中重复吗?
    • 我不确定是什么导致字段重复。
    【解决方案2】:

    @Alasdair 的回答比这个好(因为这个不妨碍提交)。但我发布它,以防万一有人想要ModelChoiceField 的“只读”。

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

    注意,对于 ChoiceField 来说,这样的事情就足够了:

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

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多