2013-03-10 93 views
5

我需要只能在某些日期时间字段中写入年份或年份和月份(除标准完整日期时间值之外)。像下面的这些模式。Django - 需要只能处理年份或年份和月份值的datetime字段

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

在mySQL中,这可以很容易地通过使用零来完成,但是那个dos在django中不起作用。这是愚蠢的time.datetime python函数,它不支持它。

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

如果能处理当地时间的东西,如果它是一个完整的数据时间值,我会很高兴。这样我可以在任何地方使用相同的字段。但这并不是特别重要。

回答

7

也许这将有助于:

DayMonthField和YearField

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

YearMonthField

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

,如果你有问题,我会回答你的明天。需要睡觉 – catherine 2013-03-10 17:43:07

+0

嗨!当我实现它时,它向我展示了'(fields.E120)CharFields必须定义一个'max_length'属性。有什么建议么? – 2016-08-11 21:45:23

+0

@Abhishek Bhatia您需要为每个CharField放置max_length = 100(或任何数字)。 Django要求您使用此参数,如下所示:var = model.CharField(max_length = 100) – MrVocabulary 2017-06-12 14:21:27