2011-02-02 9 views
16

Czy istnieje sposób, w jaki można uzyskać django do przechowywania moich danych w postgresql jako "dd-mm-rrrr" (jeśli jest to wymagane) i mieć formularze django do sprawdzania poprawności dla "dd-mm" -yyyy?format daty django "dd-mm-rrrr"

(próbowałem bez większych sukcesów rzeczy jak:

DATE_INPUT_FORMATS = ('%d-%m-%Y') 
USE_I18N = True 
USE_L10N = True 

I zrobił wiele googlowania ale bez powodzenia :(

Odpowiedz

27

Problemem okazało się, że muszę oba formaty daty ISO i Wielkiej Brytanii w pliku settings.py tak:

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

a następnie forms.py dostosowany do:

class ClientDetailsForm(ModelForm): 
    date_of_birth = DateField(input_formats=settings.DATE_INPUT_FORMATS) 
    class Meta: 
     model = ClientDetails 

Dlaczego USE_L10N = True nie mogę tego po prostu zrobić Nie wiem!

[Dzięki this i this]

+1

Nie masz formatu US, jak powiedziałeś, masz format Wielkiej Brytanii i ISO. – dalore

+0

Masz rację. Poprawiłem to – Sevenearths

-2

można użyć Charfield gdybyś chciał zapisać to w dokładnie tym formacie, w przeciwnym razie będzie on używał formatu python datetime.

Jeśli używasz pola CharField, możesz napisać formularz z własnym v alidacja dla tego pola.

+1

Jeśli chcesz wyświetlić format na stronie za pomocą szablonu, możesz użyć filtra szablonu "czas" Django: http://docs.djangoproject.com/en/1.2/ref/templates/builtins/#date – Hixi

18

DATE_INPUT_FORMATS w settings.py ma efektu USE_I18N = True. Dzieje się tak, ponieważ django załaduje określony format dla aktywnych ustawień narodowych. Django jest dostarczany z definicjami formatu dla wielu różnych ustawień narodowych.

Można zastąpić django definicje domyślnego formatu:

mysite/ 
    formats/ 
     __init__.py 
     en/ 
      __init__.py 
      formats.py 

Jak opisano w dokumentacji django: Creating custom formats file

+0

czy 'USE_L10N = True' ma jakikolwiek wpływ na' DATE_INPUT_FORMATS' – Sevenearths

+1

Jeśli 'USE_L10N = False' wtedy django nie użyje żadnego formatu z twoich ustawień. 'USE_L10N = True' umożliwia ustawienie formatów w swoim pliku settings.py. A "USE_I18N = True" idzie jeszcze dalej i włącza specyficzne dla lokalnych formatów. – Ski

8

W Sevenearths answer tam komentarz

Dlaczego USE_L10N = True nie można po prostu to zrobić, nie wiem!

Dokumentacja mówi, że USE_L10N = True jest domyślnym ustawieniem, ale aby dostać UK Terminy obrobić LANGUAGE_CODE należy również zmienić z jego ustawienie domyślnej en-us do en-GB.

Po zmianie, pola daty automatycznie akceptują formaty "dd/mm/rrrr" i "rrrr-mm-dd" (i ewentualnie inne, nie testowałem ich wszystkich) bez konieczności ustawiania input_formats = settings.DATE_INPUT_FORMATS w każdym dniu formularza pole.

2

To może nie być odpowiedź na dokładne pytanie, ale odkąd się tu dostałem ...Proponuję użyć widżetu daty i pozwolić Django zapisać datę w sposób, w jaki go rozumie. Zdefiniowania pola w formularzu tak:

import datetime 
from django import forms 

def last_years(): 
    first_year = datetime.datetime.now().year - 6 
    return list(range(first_year + 7, first_year, -1)) 

class MyForm(forms.Form): 
    # This is it... it's user friendly, and can't go wrong parsing it 
    date = forms.DateField(widget=forms.SelectDateWidget(years = last_years())) 

Jeśli masz go w polu data Django model, a następnie jedynym problemem w lewo byłoby sformatować reprezentację wyjściową. Czy mam rację?

+0

Wiele się zmieniło, odkąd zadałem to pytanie. Myślę, że twoja odpowiedź byłaby idealna dla 1.10+ – Sevenearths

+0

: D rzeczywiście ... Właśnie wpadłem na to pytanie i pomyślałem, że rzucę jakąś zaktualizowaną sugestię (6 lat później) – coya