2009-05-18 9 views
3

J'ai un formset de modèle sur un modèle avec quelques champs de date - qui est à nouveau un champ DateTimeField dans le modèle. Mais lorsqu'il s'affiche dans le modèle, il est affiché en tant que champ de texte. Comment puis-je l'afficher sous forme de liste déroulante?Formulaires de modèle et champs de date

WFormSet = inlineformset_factory(UserProfile, W, can_delete=False,exclude=[<list of fields to be excluded>], extra=3) 

Voici comment j'initialise le modelformset.

Comment remplacer ces paramètres

Répondre

6

La manière habituelle de faire est de override the default field types dans votre définition de ModelForm.

L'exemple ci-dessous fonctionnerait si vous aviez un champ DateField dans votre modèle (je remarque que vous avez un champ DateTimeField ... J'y reviendrai dans une seconde). Vous allez spécifier le même type de champ que celui qui est normalement spécifié, mais vous allez passer un widget différent au constructeur du champ de formulaire.

from django.db import models 
from django import forms 
from django.forms.extras import SelectDateWidget 

class MyModel(models.Model): 
    a_date_field = models.DateField() 

class MyModelForm(forms.ModelForm): 
    a_date_field = forms.DateField(widget=SelectDateWidget()) 

    class Meta: 
     model = MyModel 

Il n'y a pas, à ma connaissance, d'un widget équivalent prévu à DateTimeField dans Django 1.0.x. Dans ce cas, vous voudrez créer un widget personnalisé, en sous-classant peut-être SelectDateWidget. Je note d'un google rapide sur SelectDateTimeWidget qu'il y a eu plusieurs autres qui ont fait ce qui semble être le widget que vous recherchez. Je ne les ai pas utilisés, donc caveat emptor, mais quelque chose comme this SelectDateTimeWidget patch pourrait être un bon point de départ.


Edit: Lorsque vous utilisez un ModelFormset ou InlineModelFormset, vous pouvez toujours y parvenir en passant form=MyModelForm à la fonction inlineformet_factory:

MyModelFormset = inlineformset_factory(MyParentModel, MyModel, form=MyModelForm) 

Cela fonctionne parce que les deux usines de Formset modèle appellent en fait le constructeur formset_factory régulier dans leurs propres implémentations. C'est un peu difficile à comprendre parce que ce n'est pas explicitement indiqué dans les docs ... plutôt que les docs de Django font allusion à cette capacité en mentionnant en passant que les usines de formset model étendent le normal formset_factory. Chaque fois que je suis dans le doute, j'ouvre django/forms/models.py pour vérifier la signature complète des fonctions d'usine formset.

+0

Merci pour la réponse, Cependant, j'ai oublié de mentionner que j'utilise inlineformset pour initialiser le formulaire. J'ai aussi édité la question. – crashekar

+0

Pas de soucis ... J'ai mis à jour la réponse. –

+0

Bonne réponse. Mais ... "proscrit" signifie "interdit" - Je ne pense pas que ce soit ce que vous vouliez dire. Peut-être que «prescrit» est plus proche du sens que vous recherchez. –

Questions connexes