显示表单错误时,Django模板变量丢失

显示表单错误时,Django模板变量丢失,django,django-forms,django-templates,django-views,Django,Django Forms,Django Templates,Django Views,问题描述Django 1.7:- 呈现包含输入字段和一些模板变量的简单表单。模板变量在支持视图中设置,并显示一些样板法律文本 我有一个自定义的clean方法,用于检查输入字段值并根据需要设置验证错误 如果发生错误,则出错的字段将使用正确的错误消息重新显示表单 但是,模板变量丢失,即 {{my template variable}}当表单最初呈现为OK时,当表单重新呈现以显示错误时,不会设置该值 我理解为什么会发生这种情况,但有人能告诉我如何在clean方法中重置模板变量,使其按预期工作吗 代码如

问题描述Django 1.7:-

呈现包含输入字段和一些模板变量的简单表单。模板变量在支持视图中设置,并显示一些样板法律文本

我有一个自定义的clean方法,用于检查输入字段值并根据需要设置验证错误

如果发生错误,则出错的字段将使用正确的错误消息重新显示表单

但是,模板变量丢失,即

{{my template variable}}当表单最初呈现为OK时,当表单重新呈现以显示错误时,不会设置该值

我理解为什么会发生这种情况,但有人能告诉我如何在clean方法中重置模板变量,使其按预期工作吗

代码如下:-

views.py

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的问题无关。