Comment passer un paramètre à mon formulaire?
someView()..
form = StylesForm(data_dict) # I also want to pass in site_id here.
class StylesForm(forms.Form):
# I want access to site_id here
Modifier, basé sur la réponse ci-dessous:
someView()..
form = StylesForm(data_dict, site_id = 1)
class StylesForm(forms.Form):
def __init__(self,*args,**kwargs):
self.site_id = kwargs.pop('site_id')
super(StylesForm,self).__init__(*args,**kwargs)
height = forms.CharField(widget=forms.TextInput(attrs={'size':site_id}))
Vous devriez définir la méthode __init__ de votre formulaire, comme ceci:
class StylesForm(forms.Form):
def __init__(self,*args,**kwargs):
self.site_id = kwargs.pop('site_id')
super(StylesForm,self).__init__(*args,**kwargs)
bien sûr, vous ne pouvez pas accéder à self.site_id tant que l'objet n'a pas été créé. La ligne:
height = forms.CharField(widget=forms.TextInput(attrs={'size':site_id}))
ça n'a aucun sens. Vous devez ajouter l'attribut au widget après la création du formulaire. Essayez quelque chose comme ça:
class StylesForm(forms.Form):
def __init__(self,*args,**kwargs):
self.site_id = kwargs.pop('site_id')
super(StylesForm,self).__init__(*args,**kwargs)
self.fields['height'].widget = forms.TextInput(attrs={'size':site_id})
height = forms.CharField()
(pas testé)
C'est ce qui a fonctionné pour moi. J'essayais de faire un formulaire personnalisé. Ce champ dans le modèle est un champ de caractères mais je voulais un champ de choix généré dynamiquement.
La forme:
class AddRatingForRound(forms.ModelForm):
def __init__(self, round_list, *args, **kwargs):
super(AddRatingForRound, self).__init__(*args, **kwargs)
self.fields['name'] = forms.ChoiceField(choices=Tuple([(name, name) for name in round_list]))
class Meta:
model = models.RatingSheet
fields = ('name', )
Les vues:
interview = Interview.objects.get(pk=interview_pk)
all_rounds = interview.round_set.order_by('created_at')
all_round_names = [rnd.name for rnd in all_rounds]
form = forms.AddRatingForRound(all_round_names)
return render(request, 'add_rating.html', {'form': form, 'interview': interview, 'rounds': all_rounds})
Le gabarit:
<form method="post">
{% csrf_token %}
{% if interview %}
{{ interview }}
{% if rounds %}
{{ form.as_p }}
<input type="submit" value="Submit" />
{% else %}
<h3>No rounds found</h3>
{% endif %}
</form>