Django-fr

Forum

#1 10-09-2010 21:16:40

gorghoa
Membre
Lieu : amiens
Inscription : 11-08-2010
Messages : 12

paramètres de forms

Bonjour à tous,

j'ai un petit souci qui m'arrache des cheveux en ce moment, je n'arrive
pas à passer simplement un paramètre supplémentaire à un form.

Un cas concret d'un formulaire avec des liste déroulantes. le queryset
générant une liste déroulante est conditionné par une valeur (ici une id
récupérée via l'url dans la vue).

Comment faire pour qu'à partir de ma vue je puisse ajouter un paramètre
au formulaire ?

genre:
forms.MonForm(monParametreEnPlus)

J'imagine qu'un vétéran du python résoudrait ça en deux coups de cuiller
à pot mais je suis débutant avec python. d'ailleurs à l'intérieur de ces
mêmes classe de formulaire on rédéclare une autre class ( Meta ), et ça
me laisse perplexe. c'est quoi ? un attribut de class déguisé ?
bref, vous l'aurez compris, je patauge un peu dans le pythonic…

merci d'avance et à bientot.
rodrigue

Hors ligne

#2 11-09-2010 20:58:24

Jean Boussier
Membre
Inscription : 11-09-2010
Messages : 13

Re : paramètres de forms

Le 10 sept. 2010 à 22:16, Rodrigue Villetard a écrit :
> Comment faire pour qu'à partir de ma vue je puisse ajouter un paramètre
> au formulaire ?

Comme ceci:

class MyForm(forms.Form):
    select = forms.ModelChoiceField()
   
    def __init__(self, data, extra_arg):
        self.fields['select'].queryset = MonModel.objects.filter(condition=extra_arg)

puis

form = MyForm(request.POST, arg)

Disclamer: Ce code à été pondu de mémoire qu'il ne fonctionne pas directement

> à l'intérieur de ces mêmes classe de formulaire on rédéclare une autre class ( Meta ), et ça
> me laisse perplexe. c'est quoi ? un attribut de class déguisé ?


En python strict se serait effectivement un attribut de classe:
>>> print MyForm.Meta

Mais en Django  ça sert à recueillir les options de ton form

Hors ligne

#3 11-09-2010 21:30:02

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

Re : paramètres de forms

Salut,

Il suffit de modifier le __init__ de ton "form" en insérant ta ou t'es arguments
supplémentaires au début de la signature de la méthode tel que :

MonForm(forms.ModelForm):
    def __init__(self, monParametreEnPlus, *args, **kwargs):
        self.monParametreEnPlus = monParametreEnPlus
       
        super(MonForm, self).__init__(*args, **kwargs)

Ne pas oublier la partie avec le super() sinon ton ModelForm ne va pas
initialiser ses champs et tout le reste. Évidemment à la méthode __init__
original tu ne passes jamais ton ou tes arguments supplémentaires.

Et tu continues à instancier ton formulaire de la même manière, la signature
est identique si ce n'est que qu'il faut toujours spécifier ton
"monParametreEnPlus" en premier.

Comme pour le formulaire par défaut (valeurs à vide) :

MonForm(monParametreEnPlus)

Ou bien lorsqu'il recoit les données du formulaire :

MonForm(monParametreEnPlus, request.POST)

Si tu veux rajouter des champs "à la volée" (et pas en attributs statique)
c'est à faire APRÈS la ligne du super.

C'est exactement le même principe aussi avec forms.Form tout simple.

Hors ligne

#4 12-09-2010 09:17:51

gorghoa
Membre
Lieu : amiens
Inscription : 11-08-2010
Messages : 12

Re : paramètres de forms

Merci à tout les deux j'essaierai cela demain et vous tiens au courant…

J'ai essayé des trucs avec le __init__, mais carrément pataugé
(notamment pour renvoyer les paramètres au super, ou modifier les
attributs. Et pis dans le train, pas de ternet pour t'aider…

@David T. ça veut dire quoi respectivement *args et **kwargs ?
j'imagine que ça sert à renvoyer les paramètres saisis, mais j'aimerai
bien mieux saisir pourquoi il en faut deux… (en plus je comprendrai
certainement mieux la doc ^^)

bon dimanche à tous le monde, et merci.
Rodrigue.

Dernière modification par gorghoa (15-09-2010 08:12:11)

Hors ligne

#5 12-09-2010 09:39:39

Xavier Combelle
Membre
Inscription : 12-09-2010
Messages : 1

Re : paramètres de forms

> @David T. ça veut dire quoi respectivement *args et **kwargs ?
> j'imagine que ça sert à renvoyer les paramètres saisis, mais j'aimerai
> bien mieux saisir pourquoi il en faut deux… (en plus je comprendrai
> certainement mieux la doc ^^)
>   
*args c'est pour la liste des arguments positionnels et **kwargs pour le
dictionnaire des paramètres nommés

Hors ligne

#6 12-09-2010 10:56:14

Nautile Bleu
Membre
Inscription : 11-08-2010
Messages : 27

Re : paramètres de forms

>
> @David T. ça veut dire quoi respectivement *args et **kwargs ?
> j?imagine que ça sert à renvoyer les paramètres saisis, mais j?aimerai
> bien mieux saisir pourquoi il en faut deux? (en plus je comprendrai
> certainement mieux la doc ^^)
>

*args: tous les arguments
**kwargs: tous les arguments nommés (kw = keyword)

Par exemple si tu as une function func(arg1, arg2, kwarg1=foo, kwarg2=bar),
arg1 et arg2 sont dans *args et kwarg1 et kwarg2 sont dans **kwargs.
C'est un moyen simple de passer les arguments d'une fonction à une autre.

Goulwen

Hors ligne

#7 12-09-2010 17:25:44

gorghoa
Membre
Lieu : amiens
Inscription : 11-08-2010
Messages : 12

Re : paramètres de forms

merci beaucoup, ça me sera bien utile je crois…


bonne soirée.

Hors ligne

#8 13-09-2010 06:48:30

gorghoa
Membre
Lieu : amiens
Inscription : 11-08-2010
Messages : 12

Re : paramètres de forms

Bonjour à tous, toujours quelques soucis pour passer un param à un
forms.
Voici un bout de code (qui ne fonctionne pas) d'après vos suggestions.
Ça doit être syntaxiquement correct puisque pas d'erreur. Cependant,
c'est comme si ça n'avait pas d'effet de modifier l'attribut de classe
categorie. Si je retire tout l'__init__, ça revient au même :

class FormTransac(forms.ModelForm):
    categorie = None

    def __init__(self, budget, *args, **kwargs):
        query = Com_MontantCategorieParBudget.objects.filter(budget =
budget)
        self.__class__.categorie = forms.ModelChoiceField( queryset
=query)
        super(FormTransac, self).__init__(*args, **kwargs)


    class Meta:
        model = Com_Transaction





merci à tous.
Rodrigue.

Hors ligne

#9 13-09-2010 19:46:11

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

Re : paramètres de forms

Salut,

Ton "categorie = None" en attribut statique me semble ne pas avoir d'utilité
pour ce que tu veux faire.

Si j'ai bien compris donc tu veux ajouter ton champs "dynamiquement" dans le
__init__ donc cela devrait donner quelque chose comme :

class FormTransac(forms.ModelForm):
    def __init__(self, budget, *args, **kwargs):
        # Init du prototype du formulaire
        super(FormTransac, self).__init__(*args, **kwargs)
        # Champs ajoutés/modifiés
        query = Com_MontantCategorieParBudget.objects.filter(budget=budget)
        self.fields['categorie'] = forms.ModelChoiceField(queryset=query)

    class Meta:
        model = Com_Transaction

Donc tu auras noté que tu atteinds les champs de ton formulaire directement
via self.fields (qui est crée par le prototype du formulaire)

Hors ligne

#10 14-09-2010 06:10:57

gorghoa
Membre
Lieu : amiens
Inscription : 11-08-2010
Messages : 12

Re : paramètres de forms

Super, ça marche, j'avais mal lu l'astuce de jean B. du self.fields[].
merci de me l'avoir rappelé…

Voila, après plusieurs A/R amiens<−>paris + la relecture de dive into
python + la doc django, un mystère de résolu. fantomette peut se
rehabiller.

juste pour rappel et pour mémoire si qqn à le même problème:

Problématique : filtrer les options d'une liste déroulante (balise
select) dans un formulaire avec un paramètre supplémentaire à
l'instaciaton.
Solution : ajouter un __init__ adapté dans le formulaire, sans oublier
d'appeler l'__init__ du parent en lui passant ses paramètres.


class FormTransac(forms.ModelForm):
    """
        bud_id est le paramètre variable en question, récupéré dans la vue
        Com_MontantCategorieParBudget est un models.Model tout bête avec
une colonne «budget»

        *args: tous les arguments 
        **kwargs: tous les arguments nommés (kw = keyword)
    """

    def __init__(self, bud_id, *args, **kwargs):
        # Init du prototype du formulaire
        super(FormTransac, self).__init__(*args, **kwargs)
        # Champs ajoutés/modifiés
        query = Com_MontantCategorieParBudget.objects.filter(budget=bud_id)
        self.fields['categorie'] = forms.ModelChoiceField(queryset=query)

    class Meta:
        model = Com_Transaction


et instanciation avec:

FormTransac( bud_id [,autres params d'un form classique])

Attention, toujours placer bud_id en premier.


merci encore,  désolé pour ma question d'abruti et à bientôt.
Rodrigue.

Dernière modification par gorghoa (15-09-2010 08:14:34)

Hors ligne

#11 26-08-2017 07:42:48

yvonnegx4
Membre
Inscription : 01-09-2016
Messages : 3
Site Web

Re : paramètres de forms

Hi supplementary website
http://love.dating.sexblog.pw/?gain.macy
  online dating websites for kids meet gay friends adult chat live sex fathers rights in florida free chat rooms video

Hors ligne

#12 27-08-2017 09:17:33

yvonnegx4
Membre
Inscription : 01-09-2016
Messages : 3
Site Web

Re : paramètres de forms

Started new snare predict
good games to download latest android application sexy videos adult mobomarket download games niv bible apk
http://adult.android.market.sexblog.pw/?mail.marina
live tv for android mobile download download apps download play store games download free android apps for pc best adult dating website

Hors ligne

Pied de page des forums