两个模型表单一个视图表单验证不显示
Posted
技术标签:
【中文标题】两个模型表单一个视图表单验证不显示【英文标题】:Two model forms one view form validation not displaying 【发布时间】:2013-06-15 21:12:26 【问题描述】:我有一个模板,它呈现通过一个视图处理的两个表单。第一个表单“store_form”是一个引导模式,在大多数情况下,用户不需要打开它并向它提交数据。第二个表单“wo_form”将与 store_form 分开提交。当我提交到 store_form 时,内联 is_valid() 验证错误消息会正确显示。如果未正确填写字段,如何让 wo_form 显示验证错误消息?
另外,如果用户提交到 store_form,有没有办法重新输入之前放入 wo_form 的数据?它当前执行重定向,并且已经放入 wo_form 的数据丢失了。
views.py:
def work_order_form(request):
if request.method == 'POST':
if 'store_form' in request.POST:
store_form = StoreForm(request.POST)
wo_form = WorkOrderForm()
if store_form.is_valid():
store_form.save()
else:
store_form = StoreForm()
wo_form = WorkOrderForm(request.POST)
if wo_form.is_valid():
wo_form.save()
else:
wo_form = WorkOrderForm()
store_form = StoreForm()
return render_to_response('work_order_form.html', RequestContext(request,
'wo_form': wo_form,
'store_form': store_form,
))
我的 forms.py 非常基础:
class WorkOrderForm(forms.ModelForm):
class Meta:
model = WorkOrder
labels =
'name': 'Work Order',
'nte': 'NTE',
widgets =
'date_received': BootstrapDateInput(),
'trip_date': BootstrapDateInput(),
class StoreForm(forms.ModelForm):
class Meta:
model = Store
work_order_form.html(由于我想避免默认表单显示而感到困惑):
<div class="row">
<form class="form- layout " action="" method="post" name="form-type" value="wo_form">
<div class="span4 offset1">
% csrf_token %
wo_form.name.label_tag
wo_form.name
<div class="row">
<div class="span1">
<label for="wo_form.complete.label" class="checkbox">
<input type="checkbox"> wo_form.complete.label
</label>
</div>
<div class="span1">
<label for="wo_form.emergency.label" class="checkbox">
<input type="checkbox"> wo_form.emergency.label
</label>
</div>
<div class="span2">
<label for="wo_form.after_hours.label" class="checkbox">
<input type="checkbox"> wo_form.after_hours.label
</label>
</div>
</div>
wo_form.date_received.label_tag
wo_form.date_received
wo_form.trip_date.label_tag
wo_form.trip_date
wo_form.time_in.label_tag
wo_form.time_in
wo_form.time_out.label_tag
wo_form.time_out
wo_form.total_hours.label_tag
wo_form.total_hours
wo_form.nte.label_tag
wo_form.nte
wo_form.instructions.label_tag
wo_form.instructions
<label for="wo_form.completed_on_trip.label" class="checkbox">
<input type="checkbox"> wo_form.completed_on_trip.label
</label>
<input type="submit" name="wo_form" value="Submit" class="btn btn-primary">
</div>
<div class="span4">
wo_form.location.label_tag
wo_form.location
<br>
</form>
<a data-toggle="modal" class="contact" href="#storeModal" title="Edit">New Store</a>
<div class="modal hide" id="storeModal">
<form class="well contact-form" method="post" action="" name="form-type" value="store_form">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h3>Editing Store</h3>
</div>
<div class="modal-body">
% csrf_token %
store_form|as_bootstrap
</div>
<div class="modal-footer">
<input name="store_form" class="btn btn-primary" type="submit" value="Save" />
<input name="cancel" class="btn" type="submit" value="Cancel"/>
</div>
</form>
</div>
</div>
</div>
任何帮助将不胜感激。让我知道是否有任何其他资源会有所帮助!
【问题讨论】:
【参考方案1】:表单创建:
wo_form = WorkOrderForm(prefix="wo")
store_form = StoreForm(prefix="store")
在模板中使用一个标签一次发布两个表单,然后在视图中:
if request.method == 'POST':
store_form = StoreForm(request.POST, prefix="store")
wo_form = WorkOrderForm(request.POST, prefix="wo")
if 'store_form' in request.POST:
if store_form.is_valid():
store_form.save()
elif wo_form.is_valid():
wo_form.save()
....
【讨论】:
还是不行。这样做和我目前的方法有什么区别?也许我做错了模板。我有这个: 由于某种原因,这也删除了样式小部件。 在这个approch你chage 所以在request.POST中会有来自store_form的字段和 wo_form,如果您想重新输入 wo_form 中填写的数据,则必须将其添加到 post。前缀是需要在一篇文章中有两种形式的数据。通过检查按下哪个提交按钮来选择填写哪个表单。【参考方案2】:在模板中手动呈现表单时需要包含字段错误。
<div class="span1">
wo_form.subject.errors
<label for="wo_form.complete.label" class="checkbox">
<input type="checkbox"> wo_form.complete.label
</label>
</div>
有关详细信息,请参阅customizing the form template 上的文档。由于您使用的是引导程序,因此您可能会发现 crispy forms 很有用。它使使用引导程序渲染看起来不错的表单变得容易。
【讨论】:
就是这样!谢谢你。我试图让酥脆的表格与 Django-Bootstrap-Toolkit 一起工作,但没有运气。也许我会再试一次。以上是关于两个模型表单一个视图表单验证不显示的主要内容,如果未能解决你的问题,请参考以下文章