2017-08-30 52 views
1

我使用ListView來設置表單並顯示結果。然而,我不知道如何才能使form.is_valid()不是真正的表單驗證和具有相同的錯誤形式。ListView中的Django自定義表單驗證

這是我的代碼

forms.py 
class InsolventiForm(forms.Form): 

    anno_validator = RegexValidator(r'[0-9]{4}', 'L\'anno deve essere un numero di 4 caratteri') 
    anno = forms.CharField(label='Anno', required=True, max_length=4,validators=[anno_validator]) 

    def clean_anno(self): 
     anno = self.cleaned_data['anno'] 
     return anno 

views.py

from .forms import InsolventiForm 
class InsolventiView(LoginRequiredMixin, ListView): 

    template_name = 'insolventi.html' 
    model = Archivio 
    form_class = InsolventiForm 

    def get(self, request): 

     import datetime 

     if self.request.GET.get('anno'): 

      form = self.form_class(self.request.GET) 

      if form.is_valid(): 
       date = '31/12/'+self.request.GET.get('anno') 
       dateTime = datetime.datetime.strptime(date, "%d/%m/%Y") 
       dateC = '01/01/'+self.request.GET.get('anno') 
       dateTimeC = datetime.datetime.strptime(dateC, "%d/%m/%Y") 

       context = Archivio.objects.filter(~Q(quoteiscrizione__anno_quota__exact=self.request.GET.get('anno')) \ 
       & Q(data_iscrizione__lte=dateTime) \ 
       & (Q(cancellato__exact=False) | (Q(cancellato__exact=True) & (Q(data_canc__gte=dateTimeC))))) 

       self.request.session['insolventi_queryset'] = serialize('json', context) 

       return render(request, self.template_name, {'form':form}) 

      else: return redirect(reverse('insolventi')) 

     return render(request, self.template_name, {'form':self.form_class()}) 

這是我的模板,我手動顯示形式。

insolventi.html

<form method="get" action=""> 
    {% for field in form %} 
     {{ field.errors }} 
     {{ field.as_widget() }} 
    {% endfor %} 
    <input type="submit" value="Ricerca" /> 
</form> 

即使有錯誤以及form.is_valid()的返回false模板上(給我一個重定向到了同樣的看法)我從來沒有得到{{} form.errors }。 我不知道什麼是缺失!

我在想:因爲我使用表單的輸入來獲取與Django休息的JSON查詢,並將其張貼在與DataTables相同的模板上,也許我不需要使用ListView?

+1

刪除此行:'else:return redirect(reverse('insolventi'))'。您正在重定向到相同的視圖,但這不會使表單出現錯誤,它會創建一個新的空白表單。編輯:你需要用綁定的數據「渲染」表單,而不是新的實例。 –

+0

刪除那條線'return render(request,self.template_name,{'form':form})''讓我得到我的表單上的錯誤! –

+0

是的,這也適用。通常的做法就像在@ ivo的答案中一樣。您不要在'form.is_valid()'中放入'else',並讓末尾的'render'處理表單。當然,要做到這一點,您需要爲'self.request.GET.get('anno')'創建一個空表單,然後使用'{'form':form}'作爲上下文在'render'中。無論如何,它的工作,所以做任何感覺更自然。 –

回答

1

你不應該被重定向,如果有,因爲重定向將失去所有形式的數據錯誤。

嘗試刪除行:

  else: return redirect(reverse('insolventi')) 

,讓它通過下降到渲染()線。

+1

而不是刪除它,我需要替換爲渲染函數的返回語句..並傳遞它的綁定形式:) ..謝謝 –