2009-05-25 9 views
6

Django ma DATE_FORMAT oraz opcje DATE_TIME_FORMAT, które pozwalają nam na wybór formatu użyć podczas przeglądania dat, ale najwyraźniej nie pozwól mi zmienić format wejściowy na dzień podczas edycji lub dodawania w Django Admin.Europejska data wejścia w Django Admin

Domyślnym dla administratora jest: YYYY-MM-DD

Ale byłoby super używać: DD-MM-YYYY

Czy to zintegrowany w każdym razie w i18n? Czy można to zmienić bez niestandardowego modelu?

Odpowiedz

2

Na podstawie tego pomysłu zrobiłem nową klasę db.fields EuDateField:

mydbfields.py

from django import forms 
from django.forms.fields import DEFAULT_DATE_INPUT_FORMATS 
from django.db import models 

class EuDateFormField(forms.DateField): 
    def __init__(self, *args, **kwargs): 
     kwargs.update({'input_formats': ("%d.%m.%Y",)+DEFAULT_DATE_INPUT_FORMATS}) 
     super(EuDateFormField, self).__init__(*args, **kwargs) 

class EuDateField(models.DateField): 
    def formfield(self, **kwargs): 
     kwargs.update({'form_class': EuDateFormField}) 
     return super(EuDateField, self).formfield(**kwargs) 

Zauważ, że to dodaje mój format (np 31.12.2007) do istniejących formatów "standardowych" django na pierwszym miejscu.

Zastosowanie:

from mydbfields import EuDateField 
class Person(models.Model): 
    ... 
    birthday = EuDateField("Birthday", null=True, blank=True, help_text="") 

W moim przypadku to czyni dobry admin, ale najprawdopodobniej będzie w ModelForm zbyt (nie próbowałem).

Moja wersja django jest:

>>> import django 
>>> django.get_version() 
u'1.1 alpha 1 SVN-10105' 
+0

Ok, to rozwiązanie jest miłe, ale jak mogę go używać z AdminDateWidget? Ten widget jest częścią mojego MultiWidget. – alekwisnia

2

Trzeba to zrobić samemu teraz, ale jest to dość łatwe do zrobienia z formularza niestandardowego pola klasy, które ustawia input_formats argument DateField. Należy to zrobić:

class MyDateField(forms.DateField): 
    def __init__(self, *args, **kwargs): 
    kwargs.setdefault('input_formats', ("%d-%m-%Y",)) 
    super(MyDateField, self).__init__(*args, **kwargs) 

Zauważ, że input_formats jest lista, więc można określić wiele możliwości i spróbuje je w kolejności podczas analizowania danych wprowadzanych przez użytkownika.

+0

Mogę zastosować to w moich nowych formularzach, ale w jaki sposób mogę przesłonić domyślne pole formularza w witrynie administratora? – Andor

2

I zostały zmodyfikowane ustawienia tak, że wyłącza l10n i ustawić format daty explicite:

USE_L10N = False 
DATE_FORMAT = 'd-m-Y' 
DATETIME_FORMAT = 'd-m-Y H:i' 

Można ustawić DATE_INPUT_FORMATS również.

9

Istnieje oficjalny sposób, aby zrobić to teraz, od czasu zamknięcia wersji Django 1.22.

Jeśli masz USE_L10N zestaw do False, co należy zrobić, to określić DATE_INPUT_FORMATS i DATETIME_INPUT_FORMATS w swoim settings.py. Oto ustawienia używać do tego, oparte na konwersję wartości domyślne:

#dd/mm/yyyy and dd/mm/yy date & datetime input field settings 
DATE_INPUT_FORMATS = ('%d-%m-%Y', '%d/%m/%Y', '%d/%m/%y', '%d %b %Y', 
         '%d %b, %Y', '%d %b %Y', '%d %b, %Y', '%d %B, %Y', 
         '%d %B %Y') 
DATETIME_INPUT_FORMATS = ('%d/%m/%Y %H:%M:%S', '%d/%m/%Y %H:%M', '%d/%m/%Y', 
          '%d/%m/%y %H:%M:%S', '%d/%m/%y %H:%M', '%d/%m/%y', 
          '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%d') 

Jeśli masz USE_L10N zestaw do True, następnie trzeba będzie użyć FORMAT_MODULE_PATH zamiast.

Na przykład, mój LANGUAGE_CODE jest ustawiony na en-au, moja strona nazywa golf, a mój FORMAT_MODULE_PATH jest ustawiony na golf.formats, więc moja struktura katalogów wygląda następująco:

golf/ 
    settings.py 
    ... 
    formats/ 
     __init__.py 
     en/ 
      __init__.py 
      formats.py 

i ustawienia DATE_INPUT_FORMATS i DATETIME_INPUT_FORMATS są w formats.py zamiast settings.py.

+1

Zrobiłem dla mnie przyjemność. Dzięki! –

0

po prostu uważaj, aby nie zapisać go jako ciąg, ale jako krotkę. np

DATE_INPUT_FORMATS = ('%d.%m.%Y',) 

jeśli chcesz mieć tylko jeden poprawny sposób zapisu daty w formularzu.