django.forms et datepicker
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 )