web-dev-qa-db-fra.com

Django Forms: paramètre pass to form

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}))
20
user984003

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

30
Emanuele Paolini

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>
1