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.

19
demandé sur Jason Aller 2009-10-03 15:10:10

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.

36
répondu Cat Plus Plus 2016-12-30 19:27:27

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:

  1. 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
  2. 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

11
répondu Cherif KAOUA 2014-10-08 18:40:44

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)
6
répondu sorki 2009-10-03 12:08:26

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 }}
4
répondu qscgyjqscgyj 2013-10-08 04:47:17