Django: comment formater une représentation datefield?
j'ai un formulaire avec un champ de données. La valeur de date existante est formatée pour afficher comme ceci:
2009-10-03
Comment puis-je le formater pour qu'il ressemble à ceci:
03.10.2009
j'ai trouvé un widget qui le rend comme ceci, mais la validation n'autorise pas les valeurs que j'entre alors.
4 réponses
pour afficher la valeur initiale du champ correctement formatée, utilisez DateInput
widget. Pour personnaliser la validation, utilisez input_formats
mot-clé argument de DateField
.
Pourquoi avez-vous besoin des deux format
et input_formats
?
format
- le format dans lequel la valeur initiale de ce champ sera affichée. Voir ici.
input_formats
- Une liste des formats utilisés pour tenter de convertir une chaîne valide datetime.date objet. Voir ici.
Méthode 1 : manuel de format de rendu, mais ne parvient pas datefield format de validation
ainsi la meilleure solution formative pour vous serait "."
{{field.value.day|stringformat:"02d"}}.{{field.value.month|stringformat:"02d"}}.{{field.value.year}}
pour obtenir de l' 24.05.2010
j'ai ajouté stringformat:"02d" pour ne pas faire 25.5.2010 comme valeur de sortie.
je poste le code complet d'un champ pour avoir une idée :
<input class="form-control" data-inputmask="'mask':'99.99.9999'" data-toggle="masked" name="{{field.html_name}}" placeholder="{{ field.label }}" {% if field.field.required %}required=""{% endif%} type="text" value="{{field.value.day|stringformat:"02d"}}.{{field.value.month|stringformat:"02d"}}.{{field.value.year}}" " >
j'ai principalement utilisé ce formatage pour la valeur date sur une instance existante d'une mise à jour (model) forme (UpdateView classe).
Cette solution peut échouer lors de la soumission du formulaire de mise à jour si elle ne satisfait pas au format
Méthode 2 : (mieux) automatiser le formatage des valeurs des champs + valider correctement en utilisant les paramètres
c'est fait en ajoutant des paramètres locaux personnalisés à settings.py fichier : La partie la plus importante est l' DATE_INPUT_FORMATS tuple
..
..
USE_L10N = True
..
DATE_INPUT_FORMATS = (
'%d.%m.%Y', '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.2006', '25.10.06'
'%d-%m-%Y', '%d/%m/%Y', '%d/%m/%y', # '25-10-2006', '25/10/2006', '25/10/06'
'%d %b %Y', # '25 Oct 2006',
'%d %B %Y', # '25 October 2006',
)
DATE_FORMAT = 'j F Y'
TIME_FORMAT = 'H:i'
DATETIME_FORMAT = 'j F Y H:i'
YEAR_MONTH_FORMAT = 'F Y'
MONTH_DAY_FORMAT = 'j F'
SHORT_DATE_FORMAT = 'j N Y'
SHORT_DATETIME_FORMAT = 'j N Y H:i'
FIRST_DAY_OF_WEEK = 1
Le plus important:
- la validation des champs de données est fait sur insert et mise à jour avec tous les formats présents dans DATE_INPUT_FORMATS tuple
- dans updateView, le champ date sera rendu en utilisant the first format of DATE_INPUT_FORMATS tuple (je veux dire en utilisant DATE_INPUT_FORMATS[0] = = %D.%M.%Y')
donc le choix du premier élément est important dans ce tuple car il définit la formation de la valeur existante du champ de données sur les formulaires de mise à jour
Vous pouvez appliquer javascript validation sur UpdateViews en utilisant aussi ce premier format.
Testé sur django 1.6 et 1.7 , je ne sais pas pour les versions précédentes
sous-classe champ personnalisé comme ceci:
class CustomDateField(forms.DateField):
def __init__(self, *args, **kwargs):
kwargs.setdefault('input_formats', ("%d.%m.%Y",))
super(CustomDateField, self).__init__(*args, **kwargs)
Vous pouvez afficher la date dans le modèle au moyen de
{{ your_object.date_field.day }}.{{ your_object.date_field.month }}.{{ your_object.date_field.year }}