在单个HTML表单中,我将呈现不同的Django模型。
这些表格可能(也可能会)具有相同的字段名称(例如“内容”)。因此,我需要将modelform实例的对象ID附加到表单中的每个字段,以确保它们具有唯一的HTML输入名称)。我在init上这样做:
class Edit_Text_Block_Form(ModelForm):
content = forms.CharField(widget = forms.Textarea(
attrs = {
"class": "full_tinymce"
}),
label = "",
)
class Meta:
model = TextBlock
fields = []
def __init__(self, user, *args, **kwargs):
self.user = user
super(Edit_Text_Block_Form, self).__init__(*args, **kwargs)
old_fields = self.fields
new_fields = {}
for field in old_fields:
new_fields[str(self.instance.id)+"_"+field] = self.fields[field]
self.fields = {}
for field in new_fields:
self.fields[field] = new_fields[field]
这很好用,html渲染了名称和ID,如“96_content”,这就是我想要的。
然而,在保存时,当它只看到“96_content”并且感到困惑时,它会查看我的字段以保存“内容”字段。因此,我还需要覆盖模型保存功能。我一直这样做:
def save(self, *args, **kwargs):
old_fields = {}
for field in self.fields:
real_name = field.split("_")[1]
old_fields[real_name] = self.fields[field]
self.fields = old_fields
super(Edit_Text_Block_Form, self).save(*args, **kwargs)
然而,由于我无法弄清楚的原因,这是行不通的。保存功能完成且没有错误,但我的表单更改都没有。我唯一的猜测是,当我执行old_fields [real_name] = self.fields [field]时,可能没有复制字段值。
我的主要问题是:在 init ()中更改名称并在save()
我充满希望的问题是:我有更好的方法来做这件事吗? (通过“this”,我的意思是“使用ModelForm实例的object_id命名每个HTML字段,以确保与同一html表单中包含的其他字段的唯一性)?
感谢您的帮助!