Prise de Django formes.DateField l'usage local format de la date
J'essaie de trouver un moyen facile de construire des formes qui montrent les dates en australie format (jj/mm/aaaa). C'était le seul moyen que j'ai pu trouver pour le faire. Il semble qu'il devrait y avoir une meilleure solution.
Choses à noter:
- Créé un nouveau widget qui la rend à la valeur de date sous la forme jj/mm/aaaa
- Créé de nouveaux champ de date à ajouter à la localiser chaîne de format de date à la liste des valeurs qu'il tente d'utiliser
J'imagine que la solution idéale serait d'avoir un datefield automatiquement localisé mais cela ne fonctionne pas pour moi (strftime ne semblent pas être en unicode sympa, mais je n'ai pas essayé très dur)
Suis-je raté quelque chose? Est-il une solution plus élégante? Est-ce une approche robuste?
from models import *
from django import forms
import datetime
class MyDateWidget(forms.TextInput):
def render(self, name, value, attrs=None):
if isinstance(value, datetime.date):
value=value.strftime("%d/%m/%Y")
return super(MyDateWidget, self).render(name, value, attrs)
class MyDateField(forms.DateField):
widget = MyDateWidget
def __init__(self, *args, **kwargs):
super(MyDateField, self).__init__(*args, **kwargs)
self.input_formats = ("%d/%m/%Y",)+(self.input_formats)
class ExampleForm(ModelForm):
class Meta:
model=MyModel
fields=('name', 'date_of_birth')
date_of_birth = MyDateField()
Une alternative simple est de s'appuyer sur un javascript widget de calendrier pour faire de la localisation. Celui que nous utilisons simplement le cache de mon champ de date et crée un autre avec le formatage local spécifié.
Aucune info particulière sur les widgets et de brancher un widget?
Je suppose que je devrais reportez-vous à la stackoverflow question: stackoverflow.com/questions/114068/....
Ma réponse ci-dessous fournit une vue beaucoup plus généralisée de l'approche de remplacer le format du widget.
Aucune info particulière sur les widgets et de brancher un widget?
Je suppose que je devrais reportez-vous à la stackoverflow question: stackoverflow.com/questions/114068/....
Ma réponse ci-dessous fournit une vue beaucoup plus généralisée de l'approche de remplacer le format du widget.
OriginalL'auteur olivergeorge | 2009-09-21
Vous devez vous connecter pour publier un commentaire.
Certes, je ne suis pas un django/python Jedi, mais...
Je ne pense pas qu'il y est quelque chose de mal avec votre approche. C'est une lecture propre.
Vous ne pourriez pas besoin de créer votre propre widget juste pour le rendu de la date dans le format approprié sur le premier affichage du formulaire. Utilisez simplement le
format
paramètre pour laDateInput
widget et vous devriez être OK. Donc, dans votre MyDateField classe, je voudrais juste faire:Vous pouvez utiliser
formfield_callback
(Voir la accepté de répondre à pour cette lointainement liée à la question), ce qui signifie:Faire qui élimine complètement le besoin pour votre
MyDateField
classe, mais peuvent introduire, - si vous voulez que chaque classe de formulaire d'appelcustomize_fields
- la nécessité d'un ModelForm descendant, la mise en œuvre deformfield_callback=customize_fields
comme la nouvelle base pour toutes vos classes de formulaire.Mon problème avec l'utilisation de la
formfield_callback
mécanisme est double:C'est moins lisible et repose dans la connaissance du fonctionnement interne de ModelForms. Je ne trouve pas de documentation disponible sur formfield_callback n'importe où...
Si jamais vous avez besoin de redéfinir un modèle de champ dans un ModelForm, dire à faire sur le terrain pas nécessaire pour que cette instance particulière de la forme, comme suit:
vous d'écraser le champ de formulaire renvoyé par customize_fields, donc de perdre complètement la personnalisation.
Je pense que votre approche est plus lisible.
OriginalL'auteur cethegeek
J'ai utilisé cette approche simple avant: il suffit de régler le 'format' attribut de la DateField.widget de l'init du Formulaire:
OriginalL'auteur alan
Tous les widget personnalisé des choses peut être contourné.
Voici un extrait de
django/forms/widgets.py
:Vous remarquerez que le format du widget est définie à l'aide du module de format de. Le format de module est sélectionné selon les paramètres régionaux. Si vous êtes à la navigation depuis les états-unis, Django, par défaut, sélectionnez
django.conf.formats.locale.en.formats.py
. Ici vous trouverez le format par défaut:Comme vous pouvez le voir dans le premier bloc de code, Django sélectionne le premier de ces. L'approche approfondie de changer le format est de créer votre propre format de module, remplaçant de Django reinhardt par défaut pour les paramètres régionaux en question. Pour cela, regardez dans FORMAT_MODULE_PATH. Si tout ce que vous essayez de faire est de remplacer le format de date par défaut, je dis vous épargner du temps et de monkey patch. J'ai ajouté à mon fichier de réglages et tout semble fonctionner parfaitement avec mon préféré format par défaut:
OriginalL'auteur Josh
Dans mon formulaire je me'en utilisant:
OriginalL'auteur vixh