【问题标题】:Django - Need datetime fields that can handle only year, or year and month valuesDjango - 需要只能处理年份或年份和月份值的日期时间字段
【发布时间】:2013-03-10 17:23:40
【问题描述】:

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

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 中是否有一些简单的方法可以做到这一点?如果没有,是否有一些扩展可以为我做到这一点?如果没有,我该如何以最好的方式解决这个问题?

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

【问题讨论】:

标签: python django datetime


【解决方案1】:

也许这会有所帮助:

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() 

【讨论】:

  • 如果你有问题,我明天会回答。需要睡觉
  • 嗨!当我实现它时,它向我展示了(fields.E120) CharFields must define a 'max_length' attribute.。有什么建议吗?
  • @Abhishek Bhatia 您需要为每个 CharField 设置 max_length = 100(或任何数字)。 Django 要求你使用这个参数,像这样: var = model.CharField(max_length = 100)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多