显示表单错误时,Django模板变量丢失
问题描述Django 1.7:- 呈现包含输入字段和一些模板变量的简单表单。模板变量在支持视图中设置,并显示一些样板法律文本 我有一个自定义的clean方法,用于检查输入字段值并根据需要设置验证错误 如果发生错误,则出错的字段将使用正确的错误消息重新显示表单 但是,模板变量丢失,即 {{my template variable}}当表单最初呈现为OK时,当表单重新呈现以显示错误时,不会设置该值 我理解为什么会发生这种情况,但有人能告诉我如何在clean方法中重置模板变量,使其按预期工作吗 代码如下:- views.py显示表单错误时,Django模板变量丢失,django,django-forms,django-templates,django-views,Django,Django Forms,Django Templates,Django Views,问题描述Django 1.7:- 呈现包含输入字段和一些模板变量的简单表单。模板变量在支持视图中设置,并显示一些样板法律文本 我有一个自定义的clean方法,用于检查输入字段值并根据需要设置验证错误 如果发生错误,则出错的字段将使用正确的错误消息重新显示表单 但是,模板变量丢失,即 {{my template variable}}当表单最初呈现为OK时,当表单重新呈现以显示错误时,不会设置该值 我理解为什么会发生这种情况,但有人能告诉我如何在clean方法中重置模板变量,使其按预期工作吗 代码如
def form1(request):
legal_text = "Some long legal paragraph ...."
if request.method == 'POST':
form = form1(request.POST)
# do stuff with the posted values ...
else:
form = form1()
return render(request,'form11.html', {'form': form, 'legal_text': legal_text})
forms.py
class form1(forms.Form):
# form contains lots of input questions 'q1', 'q2' etc that are cross-validated
def clean(self):
cleaned_data = super(form1,self).clean()
if not cleaned_data.get('q1'):
self._errors['q1'] = 'Please provide a selection'
if not cleaned_data.get('q2'):
self._errors['q2'] = 'Please provide a selection'
Q1_CHOICES = (('10', 'Yes',), ('01', 'No',),)
q1 = forms.ChoiceField(required=False,label="This is question 1",help_text="Some arbitrary help text",widget=forms.RadioSelect,choices=Q1_CHOICES)
Q2_CHOICES = (('10', 'Yes',), ('01', 'No',),)
q2 = forms.ChoiceField(required=False,label="This is question 1",help_text="Some arbitrary help text",widget=forms.RadioSelect,choices=Q2_CHOICES)
# more questions omitted ...
form1.html代码段
<html>
<body>
{{ legal_text }} <!-- this is NOT displayed properly when errors occur -->
<h4><strong>{{ form.q1.label }}</strong></h4>
{% if form.q1.errors %}
<div class="alert alert-danger" role="alert">{{form.q1.errors }}</div>
{% endif %}
<br/>
{{ form.q1.help_text }}
<br/><br/>
{{ form.q1 }}
<br/>
<h4><strong>{{ form.q2.label }}</strong></h4>
{% if form.q2.errors %}
<div class="alert alert-danger" role="alert">{{form.q2.errors }}</div>
{% endif %}
<br/>
{{ form.q2.help_text }}
<br/><br/>
{{ form.q2 }}
</body>
</html>
在这里,您将覆盖form clean方法,而不返回clean_数据。像这样替换代码
def clean(self):
cleaned_data = super(form1,self).clean()
if not cleaned_data.get('q1'):
self._errors['q1'] = 'Please provide a selection'
if not cleaned_data.get('q2'):
self._errors['q2'] = 'Please provide a selection'
return self.cleaned_data
给我们看看代码!另外,如果自定义验证是一个问题,为什么不使用自定义验证程序而不是重写clean?在clean方法中不使用模板变量,而是在视图中执行。您应该显示。谢谢-添加了代码-希望这在您发布的代码中有用,当表单无效时,法律文本应该明确显示。谢谢-我错误配置了表单回发。好吧,虽然这是真的,但和OP的问题无关。