django, uni_form et la fonction __init de python de __ () - comment passer des arguments à une forme?

StackOverflow https://stackoverflow.com/questions/1700043

Question

Je vais avoir un peu de difficulté à comprendre comment la fonction __init__ python () fonctionne. Ce que je suis en train de faire est de créer une nouvelle forme django, et utiliser l'assistant uni_form pour afficher la forme d'une manière personnalisée à l'aide fieldsets, mais je passe un argument à la forme qui devrait changer légèrement la mise en page du formulaire et je ne peux pas comprendre comment faire ce travail. Voici mon code:

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 une valeur en dehors de __init__, et par conséquent, même si je suis passé cet argument à la fonction je ne peux pas utiliser la valeur dans ma classe. J'ai trouvé une solution pour ce qui est de créer la forme entièrement à l'intérieur __init__ utilisant self.fields, mais ce qui est laid. Comment puis-je utiliser self.canada en dehors de __init__?

Était-ce utile?

La solution

Vous avez mal compris la façon dont les classes en Python. Vous essayez d'exécuter du code dans une classe, mais en dehors de toute fonction, ce qui est peu susceptible de travailler, surtout si cela dépend de quelque chose qui se passe à l'intérieur __init__. Ce code sera évalué lorsque la classe est d'abord importée, alors que __init__ se produit lorsque chaque forme est instancié.

La meilleure façon serait sûrement d'inclure les fieldsets sous la forme, mais simplement ne les affiche pas lorsque le Canada est vrai. Votre code __init__ peut définir les champs à required=False dépendant de cette valeur, afin de ne pas les erreurs de validation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top