2010-02-05 95 views
3

我試圖訪問經過身份驗證的用戶在一個窗體類中。我玩從傳遞請求對象從視圖到類的init,但它似乎馬虎。有沒有更好的方法來訪問視圖之外的經過身份驗證的用戶或請求對象?在視圖之外訪問經過身份驗證的用戶

class LicenseForm(forms.Form): 
    '''def __init__(self, *args, **kwargs): 
    #self.fields['license'] = forms.ModelChoiceField(queryset=self.license_queryset(), empty_label='None', widget=forms.RadioSelect())''' 

    def license_queryset(): 
     queryset = License.objects.filter(organization__isnull=True) 
     # add addtional filters if the logged in user belongs to an organization 
     return queryset 

    licenses = forms.ModelChoiceField(queryset=license_queryset(), empty_label='None', widget=forms.RadioSelect()) 

回答

2

是的,你可以做到這一點,這裏有說明:http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser

雖然這個作品我個人寧願給用戶傳遞到視圖的形式。這感覺不像一個黑客。

你也可以顯示你的代碼,也許它可以改進。爲什麼你必須在表單中訪問用戶?

更新: 你可以做這樣的事情:

class LicenseForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(LicenseForm, self).__init__(*args, **kwargs) 
     self._user = kwargs.get('user',None) 
     self.fields['licenses'] = forms.ModelChoiceField(queryset=self.license_queryset(), empty_label='None', widget=forms.RadioSelect()) 

    def license_queryset(self): 
     queryset = License.objects.filter(organization__isnull=True) 
     if self._user and self._user.belongsTo('SomeOrganization'): 
      queryset = queryset.filter(whatever='fits') 
     return queryset 

恕我直言,這是因爲與當地的線程搞亂一個更清潔的方式。

+0

我編輯了我的原始帖子,以顯示我正在使用的代碼。因此,在license_queryset方法中,我想根據經過身份驗證的用戶關聯添加一些其他過濾器。註釋掉的__init__是我要從視圖中接受請求對象的地方。 – CrashRoX 2010-02-05 01:57:34

+0

你的權利,這似乎更清潔。我感謝所有的幫助。 我之前玩過相同的代碼方法,但一直在遇到能夠在license_queryset中訪問自己的問題。我必須在init中動態創建許可證表單字段以解決此問題。有沒有辦法讓license_queryset擁有自己的範圍,仍然可以從許可證表單聲明中調用它?對不起,如果這些都是新問題。剛開始使用django和python :) – CrashRoX 2010-02-05 02:11:16

+0

@CrashRoX:你說得對,我忘了重要的一點。改變了它。當你定義類方法時,你總是必須至少提供一個參數(爲了方便起見,稱爲「self」)。稍後當您調用該函數時,您不必傳遞它,它會自動完成。這可能會幫助你進入它:http://docs.python.org/tutorial/classes.html – 2010-02-05 02:28:05

相關問題