2009-11-09 5 views
2

J'ai un peu de difficulté à comprendre comment fonctionne la fonction python __init__(). Ce que j'essaye de faire est de créer un nouveau formulaire dans django, et d'utiliser le helper uni_form pour afficher le formulaire de manière personnalisée en utilisant fieldsets, mais je passe un argument au formulaire qui devrait légèrement changer la disposition du formulaire et je ne peux pas comprendre comment faire ce travail. Voici mon code:django, uni_form et __init __() fonction de python - comment passer des arguments à un formulaire?

class MyForm(forms.Form): 
    name = forms.CharField(label=_("Your name"), max_length=100, widget=forms.TextInput()) 
    city = forms.CharField(label=_("Your city"), max_length=100, widget=forms.TextInput()) 
    postal_code = forms.CharField(label=_("Postal code"), max_length=7, widget=forms.TextInput(), required=False) 

    def __init__(self, city, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     if city == "Vancouver": 
      self.canada = True 

    if self.canada: 
     # create an extra uni_form fieldset that shows the postal code field 
    else: 
     # create the form without the postal code field 

Cependant, la raison pour laquelle cela ne fonctionne pas pour moi. self.canada ne semble jamais avoir de valeur en dehors de __init__, et donc même si j'ai passé cet argument à la fonction, je ne peux pas utiliser la valeur de ma classe. J'ai trouvé une solution de contournement pour cela, qui est de créer le formulaire entièrement à l'intérieur de __init__ en utilisant self.fields, mais c'est moche. Comment utiliser self.canada en dehors de __init__?

Répondre

4

Vous avez mal compris le fonctionnement des classes en Python. Vous essayez d'exécuter du code à l'intérieur d'une classe, mais en dehors de toute fonction, ce qui est peu susceptible de fonctionner, surtout si cela dépend de quelque chose qui se passe à l'intérieur __init__. Ce code sera évalué lors de la première importation de la classe, tandis que __init__ se produit lorsque chaque formulaire est instancié. Le meilleur moyen serait sûrement d'inclure les fieldsets dans le formulaire, mais de ne pas les afficher quand canada est True. Votre code __init__ peut définir ces champs sur required=False en fonction de cette valeur, de sorte que vous n'obtenez pas d'erreurs de validation.

+0

Merci pour la réponse Daniel. Rétrospectivement, cela me semble être une question assez amateur, mais vous avez raison, j'étais confus au sujet du fonctionnement des cours. Quoi qu'il en soit, je comprends ce que vous suggérez, sauf que je ne suis pas sûr de savoir comment le faire exactement. Comment ne pas afficher un fieldset quand canada est faux? – hora

+0

Cela dépend probablement de la façon dont vous publiez le formulaire. Je ne sais pas grand-chose sur uni_form - pouvez-vous montrer votre modèle? –

+0

Oh, d'accord. J'ai choisi de ne pas afficher mon formulaire dans le template, j'utilise uni_form pour le générer, donc je ne peux pas le faire de cette façon, mais maintenant que je sais comment fonctionnent les classes en Python, je peux trouver une meilleure façon d'afficher mes formes. Merci! – hora

Questions connexes