我的表单如下:
class Form(forms.Form):
smth = forms.ChoiceField(label='Smth', choices=[(x, x) for x in my_settings.measurements])
def clean_smth(self):
smth = self.cleaned_data['smth']
problem_condition = some_convoluted_process(smth)
if problem_condition:
raise ValidationError("this sucks")
return smth
我的观点是:
if request.method == 'POST':
try:
form = Form(request.POST)
except ValidationError as e:
pass
else:
if form.is_valid():
form.save()
return redirect('this_current_page')
else:
form = Form()
我正在为表单使用自定义验证。
在理想的世界中,用户会提交表单并被重定向到同一页面。如果出现错误,则用户将位于同一页面上,但错误将列在表单下方。相反,错误(由异常ValidationError
插入)最终在表单的中间,创建一个丑陋的换行符。我已尝试过多种方法在模板中格式化/处理ValidationError
,但无济于事。
我想在同一页上完成所有这些;没有一些烦人的单独页面,用户被重定向到错误的情况下。更简单地纠正 in situ 形式比在另一页上查看错误更容易,再按一下,然后再试一次。
如果错误来自引发异常,我怎样才能在同一模板上巧妙地打印错误?我正在使用raise ValidationError
,因为我在网上找到的关于自定义表单验证的示例说,当事情因验证错误时使用异常。
答案 0 :(得分:2)
if request.method == 'POST':
if form.is_valid():
form.save()
return redirect('this_current_page')
else:
print('Error: form invalid')
# you can alert the user here with django message framework for example
else:
form = Form()
forms.py
class YourForm(forms.Form):
def clean(self):
cleaned_data = super(YourForm,self).clean()
smth = cleaned_data.get('smth')
if some_convoluted_process(smth): # Depending of what your function does
self.add_error("smth","this sucks")
return cleaned_data
通过以下内容,您可以自由地处理form
,而不是:{{form}}
,{{form.as_p}}
,{{form.as_table}}
<div id="trigger_form" class="container">
<h4>Create Alert Trigger</h4>
<form action="/triggers/{{ stationid }}/" class="form" method="post">
{% csrf_token %}
<div class="row">
<div class="col-sm-12">
<label class="control-label" for="{{form.meas_type.id_for_label}}">Meas Type *</label>
{% if form.meas_type.errors %}
<label class="color-red">
{{form.meas_type.errors.as_text}}</i>
</label>
{% endif %}
{{ form.meas_type }}
</div>
</div>
<div class="row">
<div class="col-sm-12">
<label class="control-label" for="{{form.trig_type.id_for_label}}">Trig Type *</label>
{% if form.trig_type.errors %}
<label class="color-red">
{{form.trig_type.errors.as_text}}</i>
</label>
{% endif %}
{{ form.trig_type }}
</div>
</div>
</form>
</div>