两个模型表单一个视图表单验证不显示

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

【讨论】:

还是不行。这样做和我目前的方法有什么区别?也许我做错了模板。我有这个:
#all of my stuff
由于某种原因,这也删除了样式小部件。 在这个approch你chage
store_form wo_form
所以在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 一起工作,但没有运气。也许我会再试一次。

以上是关于两个模型表单一个视图表单验证不显示的主要内容,如果未能解决你的问题,请参考以下文章

不使用 django 表单如何验证和保存表单数据

显示 ModelForms 的 django 表单验证错误

django:如何从包含外键的多个模型中制作一个表单

Django使用不完整的模型创建一个有效的ModelForm,以在表单验证后手动添加字段

单个视图中的多个表单

表单验证不显示消息