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

Two django ModelForms on the same page, same model, without Formset

我在同一个页面上有两个模型表格。该表单只有一个字段 event 被选中: forms.py

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

views.py

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

.html

      <form method="POST" action=""> {% csrf_token %}
        {{ form1 }}
        {{ form2 }}
        <input type="submit" value="Save Selections"/>
      </form>

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

我注意到 DOM id 是相同的,并且我已经能够通过在注册模型中获取一个唯一字段来更改 DOM id(在这种情况下, block)

form.py

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, })

这为该字段提供了一个唯一的 ID,但两种形式仍包含在具有相同 ID 的 div 中:div_id_event

渲染html

<form method="POST" action=""> <input type='hidden' name='csrfmiddlewaretoken' value='...' />

    <div id="div_id_event" class="form-group"> 
        <label for="event-Flex-1" class="control-label  requiredField">Event<span class="asteriskField">*</span> </label> 
        <div class="controls "> 
            <select class="select form-control" id="event-Flex-1" name="event" required>
            <option value="">---------</option>
            <option value="10">stuff</option>
            ...
            </select> 
        </div> 
    </div>

    <div id="div_id_event" class="form-group"> 
        <label for="event-Flex-2" class="control-label  requiredField">
                    Event<span class="asteriskField">*</span> </label> 
        <div class="controls "> 
            <select class="select form-control" id="event-Flex-2" name="event" required>
            <option value="">---------</option>
            <option value="10">stuff</option>
            ....
            </select> 
        </div> 
    </div>

    <input type="submit" value="Save Selections"/>
</form>

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

DOM 元素的 id 在这种情况下并不重要。重要的 属性 是输入元素的 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')

然后您将得到以您为前缀参数提供的值作为前缀的输入元素名称,这将防止您遇到的命名空间冲突。