将对象ID添加到Django表单中的字段名称

时间:2015-02-11 17:45:50

标签: python django forms

在单个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表单中包含的其他字段的唯一性)?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

你不需要做任何这些。在实例化表单时只需使用prefix parameter

请注意,如果您的多个表单的类型相同,则应使用formsets代替。