我想允许在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.'
和任何类似的格式,这样才能正常工作。