webentwicklung-frage-antwort-db.com.de

Django-Formulare: Übergeben Sie den Parameter an das Formular

Wie übergebe ich einen Parameter an mein Formular?

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

Bearbeiten Sie, basierend auf der Antwort unten:

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

Sie sollten die __init__-Methode Ihres Formulars folgendermaßen definieren:

class StylesForm(forms.Form):
    def __init__(self,*args,**kwargs):
        self.site_id = kwargs.pop('site_id')
        super(StylesForm,self).__init__(*args,**kwargs)

natürlich können Sie nicht auf self.site_id zugreifen, bis das Objekt erstellt wurde. Die Zeile:

     height = forms.CharField(widget=forms.TextInput(attrs={'size':site_id}))

macht keinen Sinn. Sie müssen das Attribut dem Widget hinzufügen, nachdem das Formular erstellt wurde. Versuchen Sie etwas so:

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

(nicht getestet)

30

Das hat bei mir funktioniert. Ich habe versucht, ein benutzerdefiniertes Formular zu erstellen. Dieses Feld im Modell ist ein Zeichenfeld, aber ich wollte, dass ein Auswahlfeld dynamisch generiert wurde. 

Die 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', )

Die Ansichten:

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

Die Vorlage:

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