How do I pass a parameter to my form?
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
You should define the __init__ method of your form, like that:
class StylesForm(forms.Form): def __init__(self,*args,**kwargs): self.site_id = kwargs.pop('site_id') super(StylesForm,self).__init__(*args,**kwargs)
of course you cannot access self.site_id until the object has been created, so the line:
height = forms.CharField(widget=forms.TextInput(attrs={'size':site_id}))
makes no sense. You have to add the attribute to the widget after the form has been created. Try something like this:
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()
(not tested)
This is what worked for me. I was trying to make a custom form . This field in the model is a charfield but I wanted a choice field generated dynamically .
The Form:
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', )
The Views:
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})
The Template:
<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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With