Puis-je faire en sorte que Django stocke mes données dans postgresql sous la forme 'jj-mm-aaaa' (si nécessaire) et fasse valider les formulaires Django pour 'jj-mm-aaaa'?
(J'ai essayé sans grand succès des choses comme:
DATE_INPUT_FORMATS = ('%d-%m-%Y')
USE_I18N = True
USE_L10N = True
Et fait beaucoup de googler mais pas de succès :(
Le problème s'est avéré que j'avais besoin des formats de date ISO et UK dans le fichier settings.py
, comme suit:
DATE_INPUT_FORMATS = ('%d-%m-%Y','%Y-%m-%d')
puis le formulaire.py ajusté à ce qui suit:
class ClientDetailsForm(ModelForm):
date_of_birth = DateField(input_formats=settings.DATE_INPUT_FORMATS)
class Meta:
model = ClientDetails
Pourquoi USE_L10N = True
ne peut pas simplement faire cela, je ne sais pas!
DATE_INPUT_FORMATS
dans settings.py n'a aucun effet avec USE_I18N = True
. En effet, Django chargera un format spécifique pour les paramètres régionaux actifs. Django est livré avec des définitions de format pour de nombreux environnements locaux.
Vous pouvez remplacer les définitions de format par défaut de Django:
mysite/
formats/
__init__.py
en/
__init__.py
formats.py
Comme décrit dans la documentation de Django: Création d'un fichier de formats personnalisés
Dans Sevenearths répond il y a le commentaire
Pourquoi
USE_L10N = True
ne peut pas simplement faire cela, je ne sais pas!
La documentation indique que USE_L10N = True
est le paramètre par défaut, mais pour que les dates au Royaume-Uni fonctionnent, il faut également modifier le paramètre LANGUAGE_CODE
de en-us
à en-GB
.
Une fois modifiés, les champs de date acceptent automatiquement les formats "jj/mm/aaaa" et "aaaa-mm-jj" (et éventuellement d’autres, je ne les ai pas tous testés) sans avoir à définir input_formats = settings.DATE_INPUT_FORMATS
dans chaque champ de date du formulaire.
Ce n'est peut-être pas la réponse à la question exacte, mais depuis que je suis arrivé ici ... Je suggère d'utiliser un widget de date et de laisser Django enregistrer la date telle qu'elle la comprend. Définissez le champ dans votre formulaire comme suit:
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()))
Si vous l'insérez dans un champ de date du modèle Django, le seul problème qui subsiste serait de formater la représentation en sortie. Ai-je raison?
Je voudrais écraser le DateTimeField mettre notre notre logique. Peu importe la façon dont postgresql le stocke, vous pouvez le formater comme vous le souhaitez.
Docs: http://docs.djangoproject.com/en/dev/ref/models/instances/