Wie kann ich Django dazu bringen, meine Daten in Postgresql als 'dd-mm-yyyy' (falls erforderlich) zu speichern und die Django-Formulare für 'dd-mm-yyyy' zu bestätigen?
(Ich habe ohne viel Erfolg Dinge versucht wie:
DATE_INPUT_FORMATS = ('%d-%m-%Y')
USE_I18N = True
USE_L10N = True
Und viel googeln, aber keinen Erfolg :(
Das Problem stellte sich heraus, dass ich sowohl das ISO- als auch das UK-Datumsformat in der settings.py
-Datei benötigte.
DATE_INPUT_FORMATS = ('%d-%m-%Y','%Y-%m-%d')
und dann die forms.py an das Folgende angepasst:
class ClientDetailsForm(ModelForm):
date_of_birth = DateField(input_formats=settings.DATE_INPUT_FORMATS)
class Meta:
model = ClientDetails
Warum USE_L10N = True
das nicht einfach kann, weiß ich nicht!
DATE_INPUT_FORMATS
in settings.py hat keine Auswirkung auf USE_I18N = True
. Dies liegt daran, dass Django ein bestimmtes Format für das aktive Gebietsschema lädt. Django wird mit Formatdefinitionen für viele verschiedene Sprachumgebungen geliefert.
Sie können Django-Standardformatdefinitionen überschreiben:
mysite/
formats/
__init__.py
en/
__init__.py
formats.py
Wie in der Django-Dokumentation beschrieben: Datei mit benutzerdefinierten Formaten erstellen
In Sevenearths answer Dort ist der Kommentar
Warum
USE_L10N = True
das nicht einfach kann, weiß ich nicht!
In der Dokumentation heißt es, dass USE_L10N = True
die Standardeinstellung ist. Damit jedoch UK-Daten funktionieren können, muss LANGUAGE_CODE
von der Standardeinstellung von en-us
in en-GB
geändert werden.
Nach der Änderung akzeptieren Datumsfelder automatisch die Formate "TT/MM/JJJJ" und "JJJJ-MM-TT" (und möglicherweise andere, ich habe sie nicht alle getestet), ohne dass in jedem Formatumfeld input_formats = settings.DATE_INPUT_FORMATS
festgelegt werden muss.
Dies ist möglicherweise nicht die Antwort auf die genaue Frage, aber seit ich hier bin ... würde ich vorschlagen, ein Datums-Widget zu verwenden, und Django das Datum so speichern, wie es es versteht. Definieren Sie das Feld in Ihrem Formular wie folgt:
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()))
Wenn Sie es in einem Datumsfeld des Django-Modells finden, besteht das einzige Problem darin, die Ausgabedarstellung zu formatieren. Habe ich recht?
Ich würde das DateTimeField überschreiben, meine Logik setzen. Es spielt keine Rolle, wie Postgresql es speichert, Sie können es nach Belieben formatieren.
Dokumente: http://docs.djangoproject.com/de/dev/ref/models/instances/