2015-07-21 53 views
0

我根据使用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) 

的问题是,我不知道如何通过“request.user”在我GETATTR()funtion。我知道,如果它是静态的,应该是这样的:

form = MyForm(user=request.user) 

但我已经试过喜欢出头:

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

而且它不会work.I'm尝试这一点,但任何想法如何在表单中列出用户文件将受到欢迎。 在此先感谢。

+0

但我的表单是我的应用程序中定义的forms.py(内容在问题中)。然后在我的views.py我有导入'从脚本导入窗体'和我的看法与getattr(窗体,窗体名)功能。 – Sergiodiaz53

+1

'MyForm = getattr(forms,'MyForm')'将返回与'from scripts.forms import MyForm'完全相同的类。如果实例化该表单正在提供错误,请发布回溯。 – Alasdair

+0

是的。如果你检查表单的代码,它期望__init__中的'user'参数正确吗?所以,如果我调用窗体如:form = MyForm(user = request.user)它可以工作,但如果我没有传递用户参数它会引发我:TypeError:__init __()有一个意想不到的关键字参数'user' – Sergiodiaz53

回答

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) 
+0

是的,对不起,getattr返回表单类。问题是,如果你做了最后一个例子,在第一行使用__init __()得到了一个意外的关键字参数'user''失败了,因为在第一次调用中我没有将'user'参数传递给init。 – Sergiodiaz53

+0

我最后一个例子会在实例化表单时在第二行发生错误,而不是第一行。看到我更新的答案,我认为问题出现在'__init__'方法中。 – Alasdair