2013-03-10 138 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