【问题标题】:Django custom form validation in ListViewListView 中的 Django 自定义表单验证
【发布时间】:2018-02-08 03:09:38
【问题描述】:

我正在使用 ListView 来设置表单并显示结果。但是,如果 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 ?

【问题讨论】:

  • 删除此行:else: return redirect(reverse('insolventi'))。您正在重定向到同一个视图,但这不会使表单出现错误,它会创建一个新的空白表单。编辑:您需要render 绑定数据的表单,而不是新实例。
  • 用这行 'return render(request, self.template_name, {'form':form})' 删除 else 条件让我的表单出现错误!
  • 是的,这也有效。通常的做法就像在@ivo's answer中一样。您不要在 form.is_valid() 中添加 else 并让最后的 render 处理表单。当然,要做到这一点,您需要为self.request.GET.get('anno') 提供一个else,在其中创建一个空表单,然后使用{'form': form} 作为render 中的上下文。无论如何,它是有效的,所以做任何对你来说更自然的事情。
  • 感谢您的帮助:)
  • 如果我处理我的请求,你是否认为我错过了某种控制或某些东西,比如在这种情况下,覆盖 get() 方法??

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


【解决方案1】:

你好,你可以试试这个帖子

custom form validation

另请参阅 django 文档

django custom validation as per document

【讨论】:

    【解决方案2】:

    如果出现错误,您不应该重定向,因为重定向会丢失所有表单数据。

    尝试删除该行:

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

    并让它通过 render() 线。

    【讨论】:

    • 我需要用渲染函数的返回语句替换它而不是删除它..并将绑定的形式传递给它:)..谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2021-06-22
    • 2011-05-04
    相关资源
    最近更新 更多