2015-07-21 42 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