Django Forms:将参数传递给表单

use*_*003 26 django django-forms

如何将参数传递给表单?

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
Run Code Online (Sandbox Code Playgroud)

编辑,基于以下答案:

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}))
Run Code Online (Sandbox Code Playgroud)

Ema*_*ini 40

您应该定义表单的__init__方法,如下所示:

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

当然,在创建对象之前,您无法访问self.site_id,因此行:

     height = forms.CharField(widget=forms.TextInput(attrs={'size':site_id}))
Run Code Online (Sandbox Code Playgroud)

没有意义.您必须在创建表单后将该属性添加到窗口小部件.尝试这样的事情:

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()
Run Code Online (Sandbox Code Playgroud)

(未测试)

  • 使用 self.site_id 访问该字段。__init__ 方法在任何其他方法之前调用,请仔细检查。 (2认同)

Ari*_*ury 10

这对我有用。我正在尝试制作自定义表单。模型中的这个字段是一个字符字段,但我想要一个动态生成的选择字段。

表格:

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', )
Run Code Online (Sandbox Code Playgroud)

观点:

    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})
Run Code Online (Sandbox Code Playgroud)

模板:

<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>
Run Code Online (Sandbox Code Playgroud)


Sve*_*n M 6

someView()..
        form = StylesForm( 1, request.POST)
Run Code Online (Sandbox Code Playgroud)

在 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()
Run Code Online (Sandbox Code Playgroud)

或者

someView()..
            form = StylesForm(site_id = 1)
Run Code Online (Sandbox Code Playgroud)

在 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()
Run Code Online (Sandbox Code Playgroud)