私は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を使用する必要はありませんか?
この行を削除してください: 'else:return redirect(reverse( 'insolventi'))'。同じビューにリダイレクトしていますが、フォームにエラーが表示されない場合は、新しい空白のフォームが作成されます。編集:新しいインスタンスではなく、バインドされたデータでフォームを 'レンダリング 'する必要があります。 –
この行の 'return render(request、self.template_name、{' form ':form})のelse条件を削除すると、フォームにエラーが表示されました。 –
はい、それも動作します。それを行う通常の方法は@ ivoの答えに似ています。 'else'を' form.is_valid() 'に入れておかないで、最後の' render'がフォームを処理するようにします。もちろん、空のフォームを作成し、コンテキストとして '{'form':form}'を使う 'self.request.GET.get( 'anno')'のために 'else'を持つ必要がありますレンダリング(render)する。とにかく、それは働いているので、あなたにもっと自然な感じをしてください。 –