我使用django formset遇到了日期验证错误。我SELECT *
FROM table1
WHERE val = 145
AND to_date(char(dateShp), 'YYYY-MM-DD') >= '2018-01-01';
时没有得到相同的验证错误。我遇到的问题是formset.is_valid()
形式检查失败,只有在使用“2018年3月20日”形式的日期时才使用视图和模板(不在shell中),而它总是通过“2018年3月20日”。
此外,我可以验证数据是否在is_valid
中,但是当我在表单的clean方法中查找时,self.cleaned_data中缺少无效的request.POST
键。也许这是正常的,因为无效密钥,但我希望在之后发生,而不是之前,如果有的话。感觉可能是它的django bug,我在django 2.0.2
以下是建筑概要,它非常香草:
due_date
使用这种结构,当我使用“2018年3月3日”时,我不断收到到期日无效的错误,而如果我在浏览器中提供“2018-03-18”的表格输入,则可以正常工作。然而在shell中,我能够验证两种日期格式是否有效:
# models.py
class Schedule(models.Model):
# ...
name = models.CharField(max_length=256)
status = models.CharField(max_length=16, default=choices.NOT_STARTED, choices=choices.SCHEDULE_STATUSES)
due_date = models.DateField(blank=True, null=True)
# ...
# forms.py
class ScheduleForm(forms.ModelForm):
class Meta:
model = models.Schedule
fields = ['name', 'user', 'status', 'due_date']
# views.py
def line_schedules_edit(request, line_slug):
line = get_object_or_404(models.Line, slug=line_slug)
queryset = line.schedules.all()
ScheduleFormSet = modelformset_factory(models.Schedule, form=forms.ScheduleForm)
if request.method == 'POST':
schedules_formset = ScheduleFormSet(request.POST)
if schedules_formset.is_valid():
schedules_formset.save()
return HttpResponseRedirect(reverse('products:line-schedules-edit',
kwargs={'line_slug': line_slug}))
else:
schedules_formset = ScheduleFormSet(queryset=queryset)
context = {
'line': line,
'formset': schedules_formset
}
return render(request, 'line-schedules-edit.html', context)
# template
{{ formset.management_form }}
{% csrf_token %}
{% for form in formset.forms %}
{% for hidden in form.hidden_fields %}{{ hidden }}{% endfor %}
{% for field in form.visible_fields %}
{{ field.errors }}
{{ field }}
{% endfor %}
{% endfor %}
为什么视图和模板验证失败,为什么表单的clean方法中缺少In [35]: POST = {
'form-TOTAL_FORMS': '2',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '2',
'form-0-name': 'Test',
'form-0-status': 'Not started',
'form-0-due_date': '2018-03-20',
'form-1-name': 'Test',
'form-1-status': 'Not started',
'form-1-due_date': 'March 20, 2018'
}
In [36]: qdict = QueryDict('', mutable=True)
qdict.update(POST)
formset = ScheduleFormSet(qdict)
In [37]: formset.is_valid()
Out[37]: True
键?
答案 0 :(得分:1)
事实证明,我需要做的就是提供输入格式,以便在格式发送到模型之前对其进行预处理。它必须是内置的模型验证失败,因为它不能以" 2018年3月2日"的形式存储它。
在表单中使用input_formats
,我们可以在模型处理之前将其转换为所需的格式:
class ScheduleForm(forms.ModelForm):
class Meta:
model = models.Schedule
fields = ['name', 'user', 'status', 'due_date']
due_date = forms.DateField(widget=forms.DateInput(format='%d %B, %Y'),
input_formats=('%d %B, %Y',),
required=False)