首页 文章

在ModelFormSet中包含editable = false字段

提问于
浏览
1

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

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

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

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

“Django应用以下规则:如果在模型字段上设置editable = False,则通过ModelForm从模型创建的任何表单都不会包含该字段 . ”

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

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

1 回答

  • 1

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

    • 将字段定义添加到ModelForm类

    • 添加 __init__ 方法,该方法实例化字段的值

    • 添加将字段添加到ModelForm类的Class Meta定义中的字段元组

    例如:

    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')
    

相关问题