5

我需要能够在我的一些日期时间字段中只写年份或年份和月份(除了标准的完整日期时间值)。就像下面的这些模式。

YYYY
YYYY-MM
YYYY-MM-DD
YYYY-MM-DD HH
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS

在 mySQL 中,这可以通过使用零轻松完成,但这在 django 中不起作用。就是那个愚蠢的 time.datetime python 函数不支持它。

在 django 中是否有一些简单的方法可以做到这一点?如果没有,是否有一些扩展可以为我做到这一点?如果没有,我该如何以最好的方式解决这个问题?

如果它是一个完整的数据时间值,如果它可以处理本地时间的标准化,我会很好。这样我就可以在任何地方使用相同的字段。但这不是超级重要。

4

2 回答 2

10

也许这会有所帮助:

DayMonthField 和 YearField

django-yearlessdate - https://github.com/seddonym/django-yearlessdate

年月字段

YEARMONTH_INPUT_FORMATS = (
    '%Y-%m', '%m/%Y', '%m/%y', # '2006-10', '10/2006', '10/06'
)

class YearMonthField(CharField):
    default_error_messages = {
        'invalid': _('Enter a valid year and month.'),
    }

    def __init__(self, input_formats=None, *args, **kwargs):
        super(YearMonthField, self).__init__(*args, **kwargs)
        self.input_formats = input_formats

    def clean(self, value):
        if value in validators.EMPTY_VALUES:
            return None
        if isinstance(value, datetime.datetime):
            return format(value, '%Y-%m')
        if isinstance(value, datetime.date):
            return format(value, '%Y-%m')
        for fmt in self.input_formats or YEARMONTH_INPUT_FORMATS:
            try:
                date = datetime.date(*time.strptime(value, fmt)[:3])
                return format(date, '%Y-%m')
            except ValueError:
                continue
        raise ValidationError(self.error_messages['invalid'])

class MyModel(models.Model):
    yearmonth = YearMonthField() 
于 2013-03-10T17:32:16.583 回答
0

还有 django-monthfield,它使用数据库中的日期字段,但小部件只选择年份和月份:

https://github.com/clearspark/django-monthfield

于 2017-07-22T17:32:59.363 回答