Django Forms: pass parameter to form

后端 未结 3 1464
悲哀的现实
悲哀的现实 2020-12-01 06:02

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):
             


        
相关标签:
3条回答
  • 2020-12-01 06:44
    someView()..
            form = StylesForm( 1, request.POST)
    

    in forms.py

    class StylesForm(forms.Form):
         #overwrite __init__
         def __init__(self,site_id,*args,**kwargs):
              # call standard __init__
              super().__init__(*args,**kwargs)
              #extend __init__
              self.fields['height'] =forms.CharField(widget=forms.TextInput(       
                                                         attrs= {'size':site_id}))
    
         height = forms.CharField()
    

    or

    someView()..
                form = StylesForm(site_id = 1)
    

    in forms.py

    class StylesForm(forms.Form):
             #overwrite __init__
             def __init__(self,site_id):
                  # call standard __init__
                  super().__init__()
                  #extend __init__
                  self.fields['height'] =forms.CharField(widget=forms.TextInput(       
                                                             attrs= {'size':site_id}))
        
             height = forms.CharField()
    
    0 讨论(0)
  • 2020-12-01 06:50

    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)

    0 讨论(0)
  • 2020-12-01 06:55

    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>
    
    0 讨论(0)
提交回复
热议问题