【问题标题】:Django Forms: pass parameter to formDjango Forms:将参数传递给表单
【发布时间】:2013-01-17 13:49:57
【问题描述】:

如何将参数传递给我的表单?

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

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

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

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

    当然,在创建对象之前您不能访问 self.site_id,所以行:

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

    没有意义。创建表单后,您必须将属性添加到小部件。试试这样的:

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

    (未测试)

    【讨论】:

    • 如何访问表单中的site_id?我试过 self.site_id 和 site_id。这给了我一个错误。我使用了断点,它似乎在通过 init 之前通过了我的所有字段定义(我需要使用 site_id)
    • 使用 self.site_id 访问该字段。 init 方法在任何其他方法之前调用,请仔细检查。
    • 我得到“名称'self'未定义”
    • 不确定我在上面的评论中是否清楚这一点,但它仍然无法正常工作。
    • 嗯。我有大约 30 个使用此变量的表单字段。不愿意添加 30 行额外的代码,每个字段一个。看看我能做什么,我猜。
    【解决方案2】:

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

    表格:

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

    观点:

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

    模板:

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

    【讨论】:

      【解决方案3】:
      someView()..
              form = StylesForm( 1, request.POST)
      

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

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

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

      【讨论】:

      • 为什么我不能使用这个简单的逻辑...非常感谢。
      猜你喜欢
      • 2020-04-13
      • 2015-07-10
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2011-11-10
      • 2017-05-28
      • 1970-01-01
      相关资源
      最近更新 更多