Django使用表单集验证表单

问题描述

我有一个带有表单集的表单。我正在尝试向表单添加自定义验证。 cust_acc_no必须是唯一的。但是,在我看来,如果form.is_valid()为false,则会出现以下错误:赋值之前引用了局部变量'formset'。在检查表单是否有效之前,如何使用自定义验证并显示原始表单?

这是我的views.py:

def newcustomer(request):
CustomerFormSet = inlineformset_factory(Customer,Customer_contact,fields=('company','contact_name','contact_tel','contact_email'),extra=15 )
form = CustomerForm(request.POST or None)
if request.method == 'POST':
    if form.is_valid():

        form_instance = form.save()
        customer = Customer.objects.get(company=form_instance)
        formset = CustomerFormSet(request.POST or None,instance=customer)

        form.save()

        if formset.is_valid():
            formset.save()
        else:
            return HttpResponse("Formset is invalid")

        return redirect('custlist')
    else:
        form = CustomerForm()
        formset = CustomerFormSet()

else:
        form = CustomerForm()
        formset = CustomerFormSet()


context = { 'form':form,'formset':formset
          }
return render(request,'customers/newcustomer.html',context)

这是我的表格。py:

class CustomerForm(forms.ModelForm):

    class Meta:
        model = Customer
        fields = '__all__'

    def clean_cust_acc_no(self):
            cust_acc_no = self.cleaned_data.get('cust_acc_no')

            if cust_acc_no is None:
                raise forms.ValidationError(_("This is unique."))
            return cust_acc_no

这是我的模板

{% extends 'base.html' %}

{% block page_head %}Add New Customer{% endblock %}

{% block navbar %}
<navbar class="mr-auto">

<div class="container-fluid">
  <ul class="nav navbar-expand">
    <li>
    <button type="submit" form="c-form" class="btn btn-outline-secondary">Add Customer</button>
    <button class="btn btn-outline-secondary" onclick="document.location='{% url 'custlist' %}'">Close Without Saving</button>
    </li>
  </ul>
</div>

</navbar>
{% endblock %}


{% block content %}
<form id="c-form" action="{% url 'newcustomer' %}" method="post">
  {{ formset.management_form }}
  {% csrf_token %}

  <div class="container-fluid ">

    <div class="row">

      <div class="col-6 ">
        <div class="row">
          <div class="col-3">{{ form.company.label }}</div>
          <div class="col-8" >{{ form.company }}</div>
          <div class="col-1"></div>
        </div>
        <div class="row">
          <div class="col-3">{{ form.cust_acc_no.label }}</div>
          <div class="col-8">{{ form.cust_acc_no }}</div>
          <div class="col-1"></div>
        </div>
        <div class="row">
          <div class="col-3">{{ form.vat_no.label }}</div>
          <div class="col-8">{{ form.vat_no }}</div>
          <div class="col-1"></div>
        </div>
        <div class="row">
          <div class="col-3">{{ form.reg_no.label }}</div>
          <div class="col-8">{{ form.reg_no }}</div>
          <div class="col-1"></div>
        </div>
        <div class="row">
          <div class="col-3">{{ form.bus_tel.label }}</div>
          <div class="col-8">{{ form.bus_tel }}</div>
          <div class="col-1"></div>
        </div>
        <div class="row">
          <div class="col-3">{{ form.mobile.label }}</div>
          <div class="col-8">{{ form.mobile }}</div>
          <div class="col-1"></div>
        </div>
      </div>

      <div class="col-6 ">
        <div class="row ">
          <div class="col-4">{{ form.addr_1.label }}</div>
          <div class="col-8">{{ form.addr_1 }}</div>
        </div>
        <div class="row">
          <div class="col-4">{{ form.addr_2.label }}</div>
          <div class="col-8">{{ form.addr_2 }}</div>
        </div>
        <div class="row">
          <div class="col-4">{{ form.addr_3.label }}</div>
          <div class="col-8">{{ form.addr_3 }}</div>
        </div>
        <div class="row">
          <div class="col-4">{{ form.addr_4.label }}</div>
          <div class="col-8">{{ form.addr_4 }}</div>
        </div>
        <div class="row">
          <div class="col-4">{{ form.statement_email.label }}</div>
          <div class="col-8">{{ form.statement_email }}</div>
        </div>
      </div>


      <div>
        <br>
        <br>
          {% include "myformset.html" %}
      </div>
    </div>

  </div>

  </form>


{% endblock content %}

这是myformset.html:

<table class="table table-borderless">

  {% for form in formset.forms %}
  {% if forloop.first %}
  <thead class="thead-light">
    <tr>
      {% for field in form.visible_fields %}
      <th>{{ field.label|capfirst }}</th>
      {% endfor %}
    </tr>
  </thead>
  {% endif %}

  <tbody>
    <tr class="{% cycle row1 row2 %}" >
       {% for field in form.visible_fields %}
       <td style="padding: 5px;" align="center" valign="middle">
          <!-- <div class="col-lg-2"> -->
          {# Include the hidden fields in the form #}
          {% if forloop.first %}
          {% for hidden in form.hidden_fields %}
          {{ hidden }}
          {% endfor %}
          {% endif %}
          {{ field.errors.as_ul }}
          {{ field }}
       </td>
       {% endfor %}
    </tr>
{% endfor %}
  </tbody>
</table>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...