Dans Django, l'ordre des champs d'un ModelForm est d'abord donné par l'ordre de déclarations des champs dans le modèle correspondant. Ensuite on peut modifier cet ordre grâce à l'attribut
fields de la classe Meta du formulaire ; c'est un tuple contenant le nom des champs, par exemple
Code :
class Meta:
model = MyModel
fields = ('name', 'description')
Mais dans Creme il y a une surcouche à ceci, qui permet de regrouper les champs par blocs ; c'est fait avec l'attribut
blocks qui est une instance de
FieldBlockManager (regardez creme/creme_core/forms/base.py) . Les groupes sont chacun décrits par un tuple contenant 3 éléments : l'identifiant du bloc, son nom affiché pour l'utilisateur, et la liste des champs. Par exemple on voit dans le formulaire de Contacts :
('coordinates', _(u'Coordinates'), ['skype', 'phone', 'mobile', 'fax', 'email', 'url_site'])
La liste des champs peut aussi avoir une valeur particulière, '*', qui est le joker qui représente tous les champs non utilisés dans les autres blocs.
Je viens de vérifier et l'attribut Meta.fields n'est pas compatible avec un FieldBlockManager ; c'est dommage et il faudra peut-être y remédier à terme. Du coup, les choix les plus accessibles sont :
- changer l'ordre dans le modèle Contact (un peu invasif, pas très propre mais simple à faire).
- écraser la valeur de
blocks dans ContactForm avec une nouvelle instance de FieldBlockManager dans lequel vous reprécisez tous les champs dans l'ordre que vous souhaitez (copier les groupes existants, mais précisez les champs pour le groupe "general" qui utilise le joker). Cette technique a aussi des défauts, car ne pas utiliser le joker pose des problèmes, notamment le fait les CustomFields n’apparaîtront pas dans le formulaire, et le fait que vous puissiez oublier facilement des champs.
- vous pouvez aussi ajouter un nouveau groupe contenant les champs qui vous intéresse de réordonner, mais peut-être qu'avoir un nouveau bloc ne vous plait pas. Attention à modifier le fichier creme/persons/templates/persons/add_contact_form.html, ou mieux le surcharger, en créant un fichier
creme/templates/persons/add_contact_form.html, afin de prendre en compte le nouveau groupe.