Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Forms: pass parameter to form

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 
like image 436
user984003 Avatar asked Feb 02 '13 08:02

user984003


2 Answers

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)

like image 151
Emanuele Paolini Avatar answered Sep 21 '22 06:09

Emanuele Paolini


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> 
like image 22
Arindam Roychowdhury Avatar answered Sep 18 '22 06:09

Arindam Roychowdhury