ListView中的Django自定义表单验证

时间:2017-08-30 11:56:52

标签: django django-forms django-class-based-views

我正在使用ListView来设置表单并显示结果。但是,我不确定如何进行表单验证,并且在form form.is_valid()不是True的情况下使用相同的表单并出现错误。

这是我的代码

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 rest在JSON中获取查询并将其发布在与DataTables相同的模板上,也许我不需要使用ListView?

2 个答案:

答案 0 :(得分:1)

如果存在错误,则不应重定向,因为重定向将丢失所有表单数据。

尝试删除该行:

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

让它落到render()行。

答案 1 :(得分:0)

您好,可以试试这篇文章

custom form validation

也可以参考django文件

django custom validation as per document