Django DateField:输入一个没有年份的日期表示今年



我想允许在DateField中输入一个没有年份的日期来表示实际年份。就像"10.6."应该意味着2021年6月10日,因为在撰写本文时是2021年。以下DATE_INPUT_FORMATS没有切割:

DATE_INPUT_FORMATS = ('%d.%m.%y', '%d.%m.%Y', '%Y-%m-%d', '%d.%m.')

这确实允许这样的投入,但今年将是0000年6月10日;不是我的目标。

有什么建议吗?

这确实允许这样的输入,但年份将是0000年6月10日。

据我所知,这将是1900年6月10日,但这当然无关紧要。

您可以在Form中实现clean_fieldname,例如:

从django导入表单从django.utils.timezone立即导入

class MyForm(forms.Form):
day = forms.DateField()
def clean_day(self):
day = self.cleaned_data['day']
ifday.year == 1900:
day = day.replace(year=now().year)
return day

因此,在clean方法中,我们检查年份是否为1900,如果是这样,我们将其替换为当前年份。

当然,如果用户输入10.6.1900,它也将在2021年6月10日之前被替换。因此,我们无法知道它是由'%d.%m'模式解析的,还是由%d.%m.%y模式解析的。

一个仍然接受1900年作为有效输入的更稳健的解决方案是覆盖表单DateField本身。尽管这附带了一个警告,即您无法轻松地与我们可以在设置中设置的输入格式集成,因此如果您想要格式本地化,这不是很合适:

import datetime
from django import forms
from django.core.exceptions import ValidationError

class YearOptionalDateField(forms.DateField):
yearless_formats = ['%d.%m.']
def to_python(self, value):
try:
return super().to_python(value)
except ValidationError:
value = value.strip()
for format in self.yearless_formats:
try:
date = self.strptime(value, format)
return date.replace(year=datetime.datetime.now().year)
except (ValueError, TypeError):
continue
raise

class YourForm(forms.Form):
date = YearOptionalDateField()

# Test
form = YourForm({'date': '10.6.'})
print(form.is_valid())  # True
print(form.cleaned_data['date'])  # 2021-06-10

注意:从DATE_INPUT_FORMATS中删除'%d.%m.'和任何类似的格式,这样才能正常工作。

相关内容

  • 没有找到相关文章

最新更新