Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ListView中的Django自定义表单验证_Django_Django Forms_Django Class Based Views - Fatal编程技术网

ListView中的Django自定义表单验证

ListView中的Django自定义表单验证,django,django-forms,django-class-based-views,Django,Django Forms,Django Class Based Views,我正在使用ListView设置表单并显示结果。但是,我不确定如何进行表单验证,并且在case form.is_valid()不正确的情况下使同一表单出现错误 这是我的密码 forms.py class InsolventiForm(forms.Form): anno_validator = RegexValidator(r'[0-9]{4}', 'L\'anno deve essere un numero di 4 caratteri') anno = forms.CharFi

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

这是我的密码

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()}) 
这是我的模板,我正在手动显示表单

unsolventi.html

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

{%形式的字段为%}
{{field.errors}}
{{field.as_widget()}}
{%endfor%}
即使有错误并且form.is_valid()在模板上返回False(给我一个重定向到同一个视图),我也永远不会得到{form.errors}。 我不知道少了什么


我在想:因为我使用表单的输入以JSON和django rest获取查询,并将其与DataTables发布在同一个模板上,也许我不需要使用ListView

你好,你能试试这个帖子吗

另请参阅django文件


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

尝试删除该行:

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

然后让它进入render()行。

删除这一行:
否则:返回重定向(reverse('disventi'))
。您正在重定向到同一视图,但这不会呈现带有错误的表单,它将创建一个新的空白表单。编辑:您需要
呈现
带有绑定数据的表单,而不是一个新实例。通过这行“return render(request,self.template_name,{'form':form}”删除else条件使我得到表单上的错误!是的,那也行。通常的做法就像@ivo的答案一样。你不能在
表单中放入
else
。是否有效()
,并让
在最后渲染
来处理表单。当然,要做到这一点,您需要为
self.request.GET.GET('anno')
创建一个空表单,然后使用
{'form':form}
作为
渲染中的上下文。不管怎样,它正在工作,所以做你觉得更自然的事情。谢谢你的帮助:)如果我处理请求,比如在本例中,重写get()方法,你认为我会错过某种控制或什么吗?我需要用render函数的return语句替换它,而不是删除它。。并把装订好的表格递给它:)。。非常感谢。