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

时间:2015-05-29 10:32:08

标签: django django-forms django-templates django-views

问题描述(Django 1.7): -

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

  2. 我有一个自定义的“干净”方法,用于检查输入字段值并根据需要设置验证错误。

  3. 如果发生错误,表单将通过错误的字段重新显示正确的错误消息。

  4. 然而,模板变量丢失了,即

    {{my-template-variable}}表示最初呈现表单时,如果重新呈现表单以显示错误,则不会设置。

    我理解为什么会发生这种情况,但有人可以建议我如何在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>
    

1 个答案:

答案 0 :(得分:0)

在这里,您将覆盖表单清理方法,而不是返回clean_data。替换您的代码,如

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
相关问题