【问题标题】: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>

任何帮助将不胜感激。让我知道是否有任何其他资源会有所帮助!

【问题讨论】:

    标签: django twitter-bootstrap django-forms django-templates django-views


    【解决方案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 一起工作,但没有运气。也许我会再试一次。
    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多