同一页面上的两个 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')
然后您将得到以您为前缀参数提供的值作为前缀的输入元素名称,这将防止您遇到的命名空间冲突。
我在同一个页面上有两个模型表格。该表单只有一个字段 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')
然后您将得到以您为前缀参数提供的值作为前缀的输入元素名称,这将防止您遇到的命名空间冲突。