ListView 中的 Django 自定义表单验证
Django custom form validation in ListView
我正在使用 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 }}。
不知道少了什么!
我在想:因为我使用表单的输入在 JSON 中使用 django rest 和 post 在与 DataTables 相同的模板上获取查询,也许我不需要使用 ListView ??
嗨,你能试试这个吗post
custom form validation
另请参阅 django 文档
如果出现错误,您不应进行重定向,因为重定向会丢失所有表单数据。
尝试删除以下行:
else: return redirect(reverse('insolventi'))
并让它落入 render() 行。
我正在使用 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 }}。 不知道少了什么!
我在想:因为我使用表单的输入在 JSON 中使用 django rest 和 post 在与 DataTables 相同的模板上获取查询,也许我不需要使用 ListView ??
嗨,你能试试这个吗post
custom form validation
另请参阅 django 文档
如果出现错误,您不应进行重定向,因为重定向会丢失所有表单数据。
尝试删除以下行:
else: return redirect(reverse('insolventi'))
并让它落入 render() 行。