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

Passing arguments to a form obtained by 'getattr()'

我正在创建一个视图,它根据使用 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)

它 work.I 并没有尝试这个,但是任何关于如何在表单中列出用户文件的想法都会受到欢迎。 提前致谢。

这与你使用getattr没有任何关系,问题出在你的__init__方法上。您需要在 调用 super().

之前弹出 user
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

动态地获得表单 class
 MyForm = getattr(forms, service.form)
 form = MyForm(user=request.user)