我有一个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}}。
答案 0 :(得分:1)
经过数小时寻找解决方案后,我终于明白了。可以通过以下方式获取和填充具有editable = false的字段的数据:
__init__
方法例如:
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')