在ModelFormSet中包含editable = false字段

时间:2013-12-04 03:02:59

标签: python django django-forms readonly

我有一个Django模型,created_on字段设置为editable=False。这是正确的行为,因为我还根据文档设置了auto_now=True

  

“按照当前的实施,将auto_now或auto_now_add设置为True   将导致该字段具有editable = False和blank = True set。“

使用管理员,您可以在editable=False中将readonly_fields设置为ModelAdmin的任何字段定义为created_on,一切都将按预期工作(即字段将显示在表单中,但它们会变灰。)

但是,在应用程序中使用ModelFormSet(即不是管理员)时,我无法弄清楚如何在表单中显示editable=True字段。根据文件:

  

“Django应用以下规则:如果你设置editable = False   模型字段,通过ModelForm从模型创建的任何表单都不会   包括那个领域。“

有人知道一种覆盖/规避这种行为的方法吗?

我宁愿不设置True,因为它是我想要保持在最基本级别的约束。如果我使用auto_now=True,我可能无法将其设置为{{1}}。

1 个答案:

答案 0 :(得分:1)

经过数小时寻找解决方案后,我终于明白了。可以通过以下方式获取和填充具有editable = false的字段的数据:

  1. 将字段定义添加到ModelForm类
  2. 添加实例化字段值的__init__方法
  3. 添加字段到ModelForm类的Class Meta定义中的字段元组
  4. 例如:

    class MyModelForm(forms.ModelForm):
        created_on = forms.DateField(widget=forms.DateInput(attrs={'readonly': 'readonly'}))
    
        def __init__(self, *args, **kwargs):
            super(MyModelForm, self).__init__(*args, **kwargs)
    
            if self.instance:
                if not self.initial.get('created_on'):
                    self.initial['created_on'] = self.instance.created_on
    
        class Meta:
            model = MyModel
            fields = ('field1', 'field2', 'etc', 'created_on')