django - 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)
这是我的forms.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>
解决方案
推荐阅读
- android - 如何通过 id 更改搜索位置?
- html - 如何在 Booststrap 4 中集中导航选项卡/药丸?
- laravel - 模型不显示数据,但保存数据,Laravel
- jquery - 使用日期选择器控件停止用户在输入中输入日期
- php - 当模型名称存储在变量中时,有什么方法可以通过变量动态访问 laravel 模型?
- java - 发生 JAXBException:无法将类型“mypackage.myclass”编组为元素,因为此上下文不知道它
- bash - 3 制表符分隔文件中的文件字符串匹配模式 awk
- alfresco - Alfresco - 工作流程详细信息页面上的文档列表
- javascript - 如何使用 JavaScript 在数组中查找不重复的数字?
- ruby-on-rails - Selenium webdriver 使用 Ruby for Chrome 进行缩放