代码之家  ›  专栏  ›  技术社区  ›  Kermit

使用kwargs将值从视图传递到非模型窗体

  •  -1
  • Kermit  · 技术社区  · 8 年前

    当我在视图中调用窗体时,我试图将其他值作为参数传递给窗体。

    我这样做是因为我想从我的视图和表单中获得我的验证。

    视图.py

    OTHER_VALUE = "the query that i run to get silly conditions"
    if request.method=='POST':
      form = MY_FORM(request.POST, OTHER_VALUE)
    

    表单.py

    class MY_FORM(forms.Form):
    
      real_value = forms.CharField()
      def clean_real_value(self):
        if OTHER_VALUE ...
    

    这让人期待 错误 :

    __init__() got an unexpected keyword argument 'OTHER_VALUE'
    

    =========

    我试着用一些不同的 __init__ 以下内容:

    class MY_FORM(forms.Form):
      real_value = forms.CharField()
    
      def __init__(self, *args, **kwargs): 
        OTHER_VALUE = kwargs.pop('OTHER_VALUE') 
        super(MY_FORM, self).__init__(*args, **kwargs)
        self.fields['OTHER_VALUE'].initial = OTHER_VALUE
    

    但我一直在搞这种 错误 以下内容:

    Exception Value: 'employee'
    Exception Location: /Users/macbook/Desktop/OrgDB/orgchart/forms.py in __init__, line 42
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Lemayzeur    8 年前

    一种方法是在表单中有一个隐藏的输入作为字段

    class MY_FORM(forms.Form):
        real_value = forms.CharField()
        other_value = forms.CharField(max_length=255,required=False,
                        widget=forms.HiddenInput())
    

    这个新字段可以在表单中提供,但最重要的是确保在检查表单验证之前添加值。

    OTHER_VALUE = "other_value"
    if request.method=='POST':
        data = request.POST.copy()
        data['other_value'] = OTHER_VALUE
        form = MY_FORM(data)
        if form.is_valid():
             pass
    

    在表单中,您可以访问值:

    ....# codes
        real_value = forms.CharField()
        other_value = forms.CharField(max_length=255,required=False,
                        widget=forms.HiddenInput())
    
        def clean_real_value(self):
            cleaned_data = super(FormName,self).clean_real_value()
            OTHER_VALUE = cleaned_data.get("other_value")
            if OTHER_VALUE ...
    
        2
  •  -1
  •   Kermit    8 年前

    当将另一个值传递给窗体时,为其分配一个键 OTHER_VALUE=OTHER_VALUE 而不是仅仅通过位置访问它。

    视图.py

    if request.method=='POST':
      form = MY_FORM(request.POST, OTHER_VALUE=OTHER_VALUE)
    

    表单.py

      def __init__(self, *args, **kwargs): 
        self.OTHER_VALUE = kwargs.pop('OTHER_VALUE', None)
        super(MY_FORM, self).__init__(*args, **kwargs)
    

    将表单类其余部分中的其他值引用为 self.OTHER_VALUE