作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Django 的同一页面上实现三种形式。每个表单都有自己的提交按钮,如我的代码所示。当我在任何一个表单上提交数据时,数据会被保存,但其他表单在结果刷新时变为空白,并且如果需要一个字段,我会在其他表单上收到验证错误,例如。
我的预感是 Django 处理 POST 和后续页面刷新的方式是导致问题的原因,它会尝试验证所有表单,而不管我按下哪个提交按钮。我认为如图所示映射按钮名称会阻止这种情况,但显然不会,也许我必须使用 AJAX 单独处理每个表单才能解决这个问题。但是我不确定这是否是解决方法,如果有人能阐明真正发生的事情(即解释 Django 在提交时试图做什么),我会很高兴,这样我就可以更好地理解如何解决。非常感谢任何帮助。在 Django 的一个 View 中处理多个表单绝非易事。
这是我的代码:
Views.py
def update_machine_view(request, brand_name_slug, mclass_slug, profile_slug):
machineentry = MachineEntry.objects.prefetch_related().select_related().get(profile_slug=profile_slug)
f_plate = PlateForm(request.POST or None, instance=machineentry.plate)
f_dimensions = DimensionsForm(request.POST or None, instance=machineentry.dimensions)
f_chassis = ChassisForm(request.POST or None, instance=machineentry.chassis)
if request.method == 'POST' and 'save_plate' in request.POST:
if f_plate.is_valid():
f_plate.save()
if request.method == 'POST' and 'save_dimensions' in request.POST:
if f_dimensions.is_valid():
f_dimensions.save()
if request.method == 'POST' and 'save_chassis' in request.POST:
if f_chassis.is_valid():
f_chassis.save()
context = {
'f_plate': f_plate,
'f_dimensions': f_dimensions,
'f_chassis': f_chassis,
'obj': machineentry,
}
return render(request, "machines/update_machine_form.html", context)
模板:
<form method="post">
{% csrf_token %}
{{ f_plate | crispy }}
<button type='submit' name='save_plate'>Save</button>
</form>
<form method="post">
{% csrf_token %}
{{ f_dimensions | crispy }}
<button type='submit' name='save_dimensions'>Save</button>
</form>
<form method="post">
{% csrf_token %}
{{ f_chassis | crispy }}
<button type='submit' name='save_chassis'>Save</button>
</form>
最佳答案
我能理解的是,您正在为每个表单传递 request.POST
,即使是未提交的表单。但是在 request.POST
中,您拥有您提交的表单的值,而不是其他表单的值。因此错误显示字段是必需的。我建议你这样做:
def update_machine_view(request, brand_name_slug, mclass_slug, profile_slug):
machineentry = MachineEntry.objects.select_related('plate', 'dimensions', 'chassis').get(profile_slug=profile_slug)
f_plate = PlateForm(instance=machineentry.plate)
f_dimensions = DimensionsForm(instance=machineentry.dimensions)
f_chassis = ChassisForm(instance=machineentry.chassis)
if request.method == 'POST':
if 'save_plate' in request.POST:
f_plate = PlateForm(request.POST, instance=machineentry.plate)
if f_plate.is_valid():
f_plate.save()
if 'save_dimensions' in request.POST:
f_dimensions = DimensionsForm(request.POST, instance=machineentry.dimensions)
if f_dimensions.is_valid():
f_dimensions.save()
if 'save_chassis' in request.POST:
f_chassis = ChassisForm(request.POST, instance=machineentry.chassis)
if f_chassis.is_valid():
f_chassis.save()
context = {
'f_plate': f_plate,
'f_dimensions': f_dimensions,
'f_chassis': f_chassis,
'obj': machineentry,
}
return render(request, "machines/update_machine_form.html", context)
关于django - 单个 View 中的多个 Django 表单 : Why Does One POST Clear Other Forms?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59727384/
我是一名优秀的程序员,十分优秀!