2013-03-10 10 views
5

Muszę być w stanie napisać tylko rok, lub rok i miesiąc (oprócz standardowych pełnych wartości datetime) w niektórych moich pól datetime. Jak te wzory poniżej.Django - Potrzebują pól datetime, które mogą obsłużyć tylko rok lub wartości roku i miesiąca

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

W mySQL można to łatwo zrobić za pomocą zer, ale to nie działa w django. To jest ta głupia funkcja python time.datetime, która nie obsługuje go.

Czy jest jakiś prosty sposób robienia tego w django? Jeśli nie, czy są jakieś rozszerzenia, które mogą to dla mnie zrobić? Jeśli nie, jak rozwiązać ten problem w najlepszy możliwy sposób?

Byłbym miły, gdyby mógł rozwiązać problem czasu lokalnego, jeśli był to pełny czas danych. W ten sposób mógłbym wszędzie korzystać z tego samego pola. Ale to nie jest super ważne.

Odpowiedz

7

Może pomogłoby to:

DayMonthField i 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

jeśli masz pytanie, będę go jutro odebrać. Potrzebujesz spać – catherine

+0

Cześć! Kiedy zaimplementowałam to, pokazał mi '(pola.E120) CharFields musi zdefiniować atrybut 'max_length'. Jakieś sugestie? –

+0

@ Abhishek Bhatia musisz podać max_length = 100 (lub dowolną liczbę) dla każdego CharField. Django wymaga użycia tego parametru, tak: var = model.CharField (max_length = 100) – MrVocabulary

Powiązane problemy