问题描述
我有一个带有表单集的表单。我正在尝试向表单添加自定义验证。 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 (将#修改为@)