django 两个 ModelForms 在一个模板上具有相同的字段名称
Posted
技术标签:
【中文标题】django 两个 ModelForms 在一个模板上具有相同的字段名称【英文标题】:django two ModelForms with same field name on one template 【发布时间】:2016-01-01 23:55:47 【问题描述】:我有两个模型,并且都具有对它们具有不同含义的字段“状态”。
class Order(models.Model):
...
status = models.PositiveIntegerField(default=0, choices=ORDER_STATUSES)
...
class ACS(models.Model):
status = models.IntegerField(default=-1, choices=STATUSES)
order = models.ForeignKey(Order, blank=True, null=True)
...
它们的形式如下:
class ACSForm(forms.ModelForm):
status = forms.ChoiceField(
choices=STATUSES,
widget=forms.Select(attrs='class': 'form-control')
)
...
class Meta:
model = ACS
fields = ('status',)
class OrderACSEditForm(forms.ModelForm):
status = forms.ChoiceField(
choices=ORDER_STATUSES,
widget=forms.Select(attrs='class': 'form-control')
)
class Meta:
model = Order
fields = ('status',)
我想在同一页面上编辑这两个字段。我的 view.py 看起来像
def edit(request, item_id=""):
data = ACS.objects.get(pk=item_id)
form = ACSForm(instance=data)
order = Order.objects.get(id=data.order.id)
form_edit = OrderACSEditForm(instance=order)
if request.POST:
form = ACSForm(request.POST, instance=data)
form_edit = OrderACSEditForm(request.POST)
if form.is_valid() and form_edit.is_valid():
form_edit.save()
obj = form.save()
messages.add_message(request, messages.SUCCESS, 'Your data successfully saved.')
if request.POST['action'] == "save_stay":
return redirect("/panel/packages/acs/edit/" + str(obj.id))
else:
return redirect("/panel/packages/acs/")
return render(request, 'ui/packages/acs/edit.html', dict(data=data, form=form, form_edit=form_edit, item_id=item_id))
和模板:
<div class="form-group % if form.status.errors %has-error% endif %">
<label>% trans "Status" %</label>
% if form.status.errors %
% for error in form.status.errors %
<label class="control-label"> error </label>
% endfor %
% endif %
form.status
</div>
<div class="form-group % if form_edit.status.errors %has-error% endif %">
<label>% trans "Order status" %</label>
% if form_edit.status.errors %
% for error in form_edit.status.errors %
<label class="control-label"> error </label>
% endfor %
% endif %
form_edit.status
</div>
但结果 form.status 从 form_edit.status 获取值是不正确的。我需要在不更改模型字段名称的情况下解决此问题,但不知道如何。
【问题讨论】:
【参考方案1】:为您的表单使用prefix
参数,为字段名称命名。
form = ACSForm(prefix='acs', instance=data)
form_edit = OrderACSEditForm(prefix='edit', instance=order)
请记住在使用 POST 数据实例化表单时也使用相同的前缀。
【讨论】:
以上是关于django 两个 ModelForms 在一个模板上具有相同的字段名称的主要内容,如果未能解决你的问题,请参考以下文章
在 ModelForms 中继承 formfield_callback 的 Django 问题
django 中的 ModelForms 是不是仅用于发布?