将参数传递给'getattr()'获得的表单

时间:2015-07-21 09:12:02

标签: python django django-forms django-views

我正在根据使用getattr()函数给出的参数创建一个加载不同形式的视图:

 form = getattr(forms, service.form)

但是在表单中我需要用户名来过滤我的文件,所以我有这个:

class MyForm(forms.Form):
    filename = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple)
    K = forms.CharField(label='K', max_length=1)
    fullOut = forms.CharField(label='fullOut', max_length=1)

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.user = kwargs.pop('user', None)
        self.fields['filename'].queryset = userFile.objects.filter(self.user)

问题是我不知道如何在我的getattr()函数中传递'request.user'。我知道如果它是静态的,它应该是这样的:

form = MyForm(user=request.user)

但我尝试过像:

form = getattr(forms, service.form, user=request.user)

它不起作用。我正在尝试这个,但任何想法如何列表表单中的用户文件将受到欢迎。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

这与您使用getattr没有任何关系,问题出在您的__init__方法中。您需要在调用user之前弹出super()

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

您应该像往常一样实例化表单:

form = MyForm(user=request.user)

在同一模块中是否声明MyForm并不重要:

class MyForm(forms.Form):
   my_field = forms.CharField()

form = MyForm(user=request.user)

或者如果使用getattr

动态获取表单类
 MyForm = getattr(forms, service.form)
 form = MyForm(user=request.user)