首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django DateField:输入不带年份的日期表示今年

问Django DateField:输入不带年份的日期表示今年
EN

Stack Overflow用户
提问于 2021-06-10 14:14:29
回答 1查看 86关注 0票数 2

我希望允许在DateField中输入不带年份的日期,以表示实际年份。像"10.6."应该是指2021年6月10日,因为在撰写本文时已经是2021年了。下面的DATE_INPUT_FORMATS并没有将其删除:

代码语言:javascript
复制
DATE_INPUT_FORMATS = ('%d.%m.%y', '%d.%m.%Y', '%Y-%m-%d', '%d.%m.')

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

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2021-06-10 14:42:34

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

代码语言:javascript
复制
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

注意:删除'%d.%m.'和DATE_INPUT_FORMATS中可能存在的任何类似格式才能正常工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67915684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档