在没有显式声明的情况下禁用Django ModelForm字段

时间:2019-02-28 12:58:44

标签: python django django-models django-forms

我有此代码:

class MyModel(models.Model):
    input_field = model.CharField(max_length=100)


class MyModelForm(forms.ModelForm):

    input_field = forms.CharField(disabled=True)    

    class Meta:
        model = MyModel

我还读过docs

  

当您像这样显式实例化表单字段时,了解ModelForm和常规Form之间的关系非常重要。

     

...

     

声明性定义的字段保持原样,因此将忽略对元属性(例如小部件,标签,help_texts或error_messages)进行的任何自定义;这些仅适用于自动生成的字段。

     

类似地,以声明方式定义的字段不会绘制其属性,例如max_length或相应模型所要求的属性。如果要维持模型中指定的行为,则在声明表单字段时必须显式设置相关参数。

是否可以通过允许我指定disabled=True的方式将kwargs传递到“表单字段”,而又不会失去ModelForm的内省和自定义的好处?必不可少,我可以吃蛋糕吗?

我知道我可以在widgets = {'input_field': widgets.TextInput(attrs={'readonly':'readonly'})类中使用Meta}来解决此问题,但是我对是否有更好的方法感兴趣

还不清楚是否如上所述修改widgets属性是否会“继承” ModelForm否则将应用的默认配置,例如从基础模型推断max_length

1 个答案:

答案 0 :(得分:0)

可能最简单的方法是覆盖__init__

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['input_field'].disabled = True