我正在根据使用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)
它不起作用。我正在尝试这个,但任何想法如何列表表单中的用户文件将受到欢迎。 提前谢谢。
答案 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)