Wilane' Weblog

jaZZ ... just another Zine Zblog

django.forms et datepicker

écrit par Ousmane Wilane, le 21/06/09 22:34.

jQuery dispose de pléthores de greffons avec une superbe façon de les packager depuis le site web avec les styles bien mariés au style de votre site. Parmi les greffons les plus célèbres on peut citer ui.effects.*, ui.accordeon, ui.dialog, ui.draggable, ui.droppable, ui.progressbar, ui.resizeable, ui.selectable, ui.slider, ui.sortable, ui.tabs et ui.datepicker.

La définition d’éléments de style avec Django est plutôt simple, et le deviendra encore plus si les travaux SoC 2009 de Zain Memon sur admin-ui venaient à être acceptés. Au niveau des éléments de formulaire, il suffit généralement de définir l’attribut `attrs' (dictionnaire) du widget que vous souhaitez associer à votre élément de formulaire:

#pour un champ date
forms.DateField(
            widget=forms.DateInput(attrs={'class':'datepicker'}, 
                                   format='%d-%m-%Y'),
            input_formats=['%d/%m/%Y %H:%M:%S',
                           '%d-%m-%Y %H:%M',
                           '%d-%m-%Y',
                           ],
            )

Une façon élégante d’affubler tous les champs de type date de l’attribut `class="datepicker"' est d’utiliser l’attribut de classe non documenté de la classe Form ou ModelForm `formfield_callback', par exemple:

def mon_datefield_perso(f):
    if isinstance(f, models.fields.DateField):
        return forms.DateField(
            widget=forms.DateInput(attrs={'class':'datepicker'}, 
                                   format='%d-%m-%Y'),
            )
    else:
        return f.formfield()

class MonForm(forms.ModelForm):
    formfield_callback = mon_datefield_perso
   
    class Meta:
        model = Monmodele

Une fois définit ce callback, il vous suffira d’utiliser dans votre template de base un appel générique à .datepicker() pour tous les éléments de la classe .datepicker:

$(function() {
    $('.datepicker').datepicker({inline: true});
});

La technique marche également pour un FormSet, *formset_factory utilise aussi ce type de callback (par défaut lambda f: f.formfield()) :

FactureFormSet = modelformset_factory(MonModele, 
                                      form=MonForm, 
                                      formfield_callback=mon_datefield_perso
                                     )

Commentaires

Laisser une réponse