【问题标题】:Include editable=false fields in ModelFormSet在 ModelFormSet 中包含 editable=false 字段
【发布时间】:2013-12-20 09:16:58
【问题描述】:

我有一个 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 应用以下规则:如果您在 模型字段,通过 ModelForm 从模型创建的任何表单都不会 包括该字段。”

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

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

【问题讨论】:

    标签: python django django-forms readonly


    【解决方案1】:

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

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

    例如:

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

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2012-07-18
      • 2016-12-23
      • 2011-04-27
      • 2012-06-14
      相关资源
      最近更新 更多