web-dev-qa-db-fra.com

format de date Django 'jj-mm-aaaa'

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 :(

17
Sevenearths

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!

[Merci à ceci et cela ]

32
Sevenearths

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

18
Ski

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.

10
Tony

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?

2
coya

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/

0
programmersbook