2013-03-10 30 views
5

私のdatetimeフィールドの中には年、年、月(標準の完全な日時値に加えて)しか書くことができないようにする必要があります。以下のようなパターン。Django - 年、年、月の値しか扱えないdatetimeフィールドが必要です

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

これは、ゼロを使って簡単に行うことができますが、そのdosはdjangoでは機能しません。それはそれをサポートしていないその愚かなtime.datetime Python関数です。

djangoでこれを行う簡単な方法はありますか?そうでない場合は、私のためにこれを行うことができるいくつかの拡張機能がありますか?もしそうでなければ、これを可能な限り最良の方法で解決するにはどうしたらいいですか?

完全なデータ時間値であれば、ローカルタイムのものを正規化することができればいいと思います。そうすれば、どこでも同じフィールドを使うことができます。しかしそれは非常に重要ではありません。

答えて

7

多分これは役立つだろう:

DayMonthFieldとYearField

ジャンゴ - 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

+0

こんにちは!私がこれを実装したとき、CharFieldsは 'max_length'属性を定義する必要があります。(fields.E120)。助言がありますか? –

+0

@Abhishek Bhatiaあなたは、各CharFieldにmax_length = 100(または何でも)を入れる必要があります。 Djangoでは、このようなパラメータを使用する必要があります:var = model.CharField(max_length = 100) – MrVocabulary

関連する問題