使用ValidationError而不是重定向到新页面

时间:2018-05-07 21:40:21

标签: django django-forms

我的表单如下:

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,因为我在网上找到的关于自定义表单验证的示例说,当事情因验证错误时使用异常。

1 个答案:

答案 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>