Vous n'êtes pas identifié(e).
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
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
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
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
> @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
>
> @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
merci beaucoup, ça me sera bien utile je crois…
bonne soirée.
Hors ligne
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
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
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
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
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