Django-fr

Forum

#1 29-11-2010 22:35:41

tux
Membre
Inscription : 29-11-2010
Messages : 5

Formset... ou autre

Bonjour,

Je souhaite créer un formulaire permettant de faire des mise à jour de plusieurs occurrences. Normalement je dois utiliser un formset a partir de mon ModelForm. Mais j'ai beaucoup de mal a trouver un exemple pour "customiser" les champs de de saisie : je souhaite afficher les widgets standards (ou pas), ajouter des champs (qui serraient) des redéfinitions des champs de mon model... etc. Si j'ai bien compris je dois "overider" les champs et éventuellement utiliser la balise meta pour ajouter les widgets au niveau de mon "ModelForm", mais je ne m'en sort pas.

Dans la discussion http://forum.django-fr.org/viewtopic.php?id=320 il y a un lien vers http://www.pointy-stick.com/blog/2009/0 … ge-django/ mais l'article à disparu.

Si vous pouviez m'aiguiller vers un exemple de code ce serrait cool. Merci d'avance, à bientôt.

Hors ligne

#2 30-11-2010 05:41:30

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Formset... ou autre

Salut,

Donc ton problème se passe dans ton ModelForm ou tu redéfinir les champs qu'il
concoit automatiquement (voire d'en rajouter de nouveaux).

Un exemple simple sur http://forum.django-fr.org/viewtopic.php?pid=2032#p2032
où la ligne commencant par "self.fields" dans le __init__ redéfinit (par
écrasement) le champs "catégorie", pour ajouter un nouveau champ il suffit
d'utiliser un nom clé d'un attribut qui n'existe pas, le champ sera simplement
ajouter à la suite des autres.

En résumé, tes champs sont simplement rangés dans le dictionnaire de
self.fields de ton Form/ModelForm, que tu peux modifier dans le __init__ de ton
Form/ModelForm juste après y avoir fait appel (via "super()") au __init__ du
type de formulaire dont tu hérites.

J'ai pas trop de liens sous la main mais tu a http://www.b-
list.org/weblog/2008/nov/09/dynamic-forms/ qui est une démonstration un peu
plus évolué.

Et pour forcer un widget spécifique sur un champs, c'est le même système
qu'avec un "Form" standard tel que
http://docs.djangoproject.com/en/dev/ref/forms/widgets/#specifying-widgets

Le lundi 29 novembre 2010 22:35:41, tux a écrit :
> Bonjour,
>
> Je souhaite créer un formulaire permettant de faire des mise à jour de
> plusieurs occurrences. Normalement je dois utiliser un formset a partir de
> mon ModelForm. Mais j'ai beaucoup de mal a trouver un exemple pour
> "customiser" les champs de de saisie : je souhaite afficher les widgets
> standards (ou pas), ajouter des champs (qui serraient) des redéfinitions
> des champs de mon model... etc. Si j'ai bien compris je dois "overider" les
> champs et éventuellement utiliser la balise meta pour ajouter les widgets
> au niveau de mon "ModelForm", mais je ne m'en sort pas.
>
> Dans la discussion
> [url]http://forum.django-fr.org/viewtopic.php?id=320[/url] il y a un lien
> vers
> [url]http://www.pointy-stick.com/blog/2009/01/23/advanced-formset-usage-dja
> ngo/[/url] mais l'article à disparu.
>
> Si vous pouviez m'aiguiller vers un exemple de code ce serrait cool. Merci
> d'avance, à bientôt.
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#3 30-11-2010 20:31:18

tux
Membre
Inscription : 29-11-2010
Messages : 5

Re : Formset... ou autre

Bonsoir,

Mille Merci, la partie initialisation fonctionne ! Je vais continuer et vous informerai au besoin. big_smile

A bientôt

Hors ligne

#4 02-12-2010 22:16:42

tux
Membre
Inscription : 29-11-2010
Messages : 5

Re : Formset... ou autre

Bonsoir ! D'abord Merci pour la rapidité et l'aide apportée à mes question précédentes !

Suite de mes questions sur le Formset.

Mon Formset permet de saisir des entrainements (mémorisés dans une table) de sportifs dans plusieurs disciplines. L'utilisateur choisi sa discipline (mémorisée dans une table) présentée automatiquement par Django dans une liste.

J'ai créé un ModelForm depuis mon modèle.

Lors de la sauvegarde, je travaille sur les données du formulaire pour modifier le modèle dans une méthode clean.

Quand la sauvegarde est lancée j'ai une erreur

TypeError at /train/manage_train/

argument of type 'Train' is not iterable

Mes données sont correctement créées mais ma page ne s'affiche pas correctement

Merci d'avance, à bientôt.

Dernière modification par tux (04-12-2010 23:23:29)

Hors ligne

#5 05-12-2010 20:35:50

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Formset... ou autre

> sur l'identifiant de la discipline alors que je n'ai pas ce problème sur
> ma page d'enregistrement simple.
"page d'enregistrement simple" ?? Celle dans l'administration de Django ou
juste une autre view ?

> (1048, "Column 'discipline_id' cannot be null") [/code]
Ton formulaire essaye de sauvegarder ton objet avec l'attribut displine_id à
"None" alors que la table sql de ton modèle spécifique pas que les valeurs null
sont autorisés.

Soit ton modèle spécifie pas l'argument null=True, soit tu l'a rajouté entre
temps sans mettre à jour ta table sql.

Soit tu fais une erreur en essayant d'enregistrer ton objet sans spécifier (ou
mal) "discipline" (un ForeignKey je suppose) alors que tu en veux forcément
un.

Hors ligne

Pied de page des forums