两个django ModelForms在同一页面上,相同的模型,没有Formset

时间:2016-12-14 06:08:59

标签: python django modelform

我在同一页面上有两个模型表单。表单只有一个字段"background-color: #FF9966;"被选中: 的 forms.py

event

views.py

class RegistrationForm(forms.ModelForm):
    class Meta:
        model = Registration
        fields = ['event']

html的

form1 = RegistrationForm(request.POST or None, instance=user_reg1)
form2 = RegistrationForm(request.POST or None, instance=user_reg2)

if request.method == 'POST':
        if form1.is_valid() and form2.is_valid():
            form1.save()
            form2.save()

表单会正确显示和填充,但是当我更改值并点击“保存”按钮时,它总是将form2选择保存到两个实例中。

我注意到DOM ID是相同的,我已经能够通过在Registration模型中抓取一个唯一字段来改变DOM id(在这种情况下, <form method="POST" action=""> {% csrf_token %} {{ form1 }} {{ form2 }} <input type="submit" value="Save Selections"/> </form>

form.py

block

这会为该字段提供唯一ID,但这两种表单仍然包含在具有相同ID的div中:class RegistrationForm(forms.ModelForm): class Meta: model = Registration fields = ['event'] def __init__(self, *args, **kwargs): block = kwargs.pop('block') # a unique field in the Registration model super(RegistrationForm, self).__init__(*args, **kwargs) if block: DOM_id = "event-" + str(block) self.fields['event'].widget.attrs.update({'id': DOM_id, })

呈现HTML

div_id_event

我甚至不知道身份是否重要。有没有办法让我在不使用Formset的情况下让这两种形式合作?

1 个答案:

答案 0 :(得分:1)

在这种情况下,DOM元素的id并不重要。重要的属性是input元素的name

听起来您需要使用ModelForm的prefix属性。检查https://docs.djangoproject.com/en/2.0/ref/forms/api/#prefixes-for-forms

使用

初始化表单
form1 = RegistrationForm(request.POST or None, instance=user_reg1, prefix='user1')
form2 = RegistrationForm(request.POST or None, instance=user_reg2, prefix='user2')

然后,您将得到前缀为prefix参数的前缀的输入元素名称,这将阻止您遇到的命名空间冲突。