django, uni_form et la fonction __init de python de __ () - comment passer des arguments à une forme?
-
19-09-2019 - |
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__
?
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.