2017-08-30 5 views
1

私はListViewを使用してフォームを設定し、結果を表示しています。しかし、私はform.is_valid()がTrueではない場合にフォームの検証を行い、エラーのある同じフォームをどのように持つことができないのかよくわかりません。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()}私は決して得る{{form.errorsテンプレートに(私に同じビューへのリダイレクトを与える)falseを返すさがある場合でも、 }。 私は何が欠けているのか分からない!

私は考えています:フォームの入力を使ってJSONでdjango restでクエリを取得し、DataTablesで同じテンプレートに投稿するので、ListViewを使用する必要はありませんか?

+1

この行を削除してください: 'else:return redirect(reverse( 'insolventi'))'。同じビューにリダイレクトしていますが、フォームにエラーが表示されない場合は、新しい空白のフォームが作成されます。編集:新しいインスタンスではなく、バインドされたデータでフォームを 'レンダリング 'する必要があります。 –

+0

この行の 'return render(request、self.template_name、{' form ':form})のelse条件を削除すると、フォームにエラーが表示されました。 –

+0

はい、それも動作します。それを行う通常の方法は@ ivoの答えに似ています。 'else'を' form.is_valid() 'に入れておかないで、最後の' render'がフォームを処理するようにします。もちろん、空のフォームを作成し、コンテキストとして '{'form':form}'を使う 'self.request.GET.get( 'anno')'のために 'else'を持つ必要がありますレンダリング(render)する。とにかく、それは働いているので、あなたにもっと自然な感じをしてください。 –

答えて

1

エラーがある場合は、すべてのフォームデータが失われますリダイレクトするので、リダイレクトすべきではありませんがジャンゴ参照してください。

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

、それはレンダリング()ラインに至るまで落下させる:

は、行を削除してください。

+1

それを削除する代わりに、私はレンダリング関数のreturn文で置き換える必要があった..とバインドされたフォームを渡す:) ..ありがとう –

関連する問題