3

我試圖檢查是否user.is_authenticated()user.has_perm(),但似乎不可能擴展django基於類的通用視圖。我發現request出現的唯一方法是get()在基於類的通用視圖中訪問用戶

class MyDetailView(DetailView): 
    def get(self, request, **kwargs): 
     import pdb 
     pdb.set_trace() 
     self.object = self.get_object() 
     context = self.get_context_data(object=self.object) 
     return self.render_to_response(context) 

那裏,我發現request.userAnonymusClass如果我登錄與否,無論實例。

(Pdb) request.user.__class__ 
<class 'django.contrib.auth.models.AnonymousUser'> 

所以檢查認證或燙髮總是會失敗:

(Pdb) self.request.user.is_authenticated() 
False 

我試着重寫其他方法,如get_object()get_context_data() ADN別人。我每個人都有self.request屬性可用,但user仍然是Anonymus

所以我的問題是:我應該如何檢查用戶是否使用基於類的視圖登錄!?

這是否意味着我必須(回去)使用基於功能的視圖?

我使用Python 2.7.1+Django version 1.4 pre-alpha SVN-16627




針對EVIAAC後: 使用login_requiredpermissions_required裝飾是不是一種選擇。檢索對象後,我需要檢查權限/登錄:如果對象的布爾字段registration_required設置爲True,則只有被請求的用戶才能看到該頁面,其他人將被重定向到登錄頁面(例如從django.contrib.flatpages借用的行爲)。

回答

2

正常工作在1.3:

class TestView(DetailView): 
    def get(self, request, **kwargs): 
     import ipdb; ipdb.set_trace() 

ipdb> request.user 
<User: zk> 
ipdb> request.user.is_authenticated() 
True 

可能是一個錯誤嗎?

+0

這一定是別的。我創建了測試項目testapp與testmodel與testview使用django 1.3,它仍然是相同的結果。也許有一些我錯過了。你能不能發佈完整的測試代碼? – seler

+0

這是完整的代碼。唯一缺少的是urlconf,正如你所期望的那樣:'url(r'^ test',TestView.as_view())' – zeekay

+0

看來這個bug只存在於使用firefox,這很奇怪。 :/ – seler

1

嘗試使用django.contrib.auth.decorators的裝修工具。在你urls.py,你可以這樣做:

from django.contrib.auth.decorators import login_required 

... 
url(r'^something/?$', login_required(MyDetailView.as_view())) 
... 

對於檢查的權限,你可以使用premissions_required裝飾。欲瞭解更多信息,請查看文檔:https://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator

+0

:在這種情況下,你能做到這樣。我需要在檢索對象後檢查權限/登錄:如果對象的布爾字段'registration_required'設置爲'True',則只有被請求的用戶才能看到該頁面,其他人將被重定向到登錄頁面(來自'django的示例行爲.contrib.flatpages')。 – seler

+0

啊。在這種情況下,我建議你寫自己的觀點,因爲他們似乎需要更具體的行爲。試圖將這種行爲強化爲一般觀點毫無意義。 – Drekembe

+0

通用視圖沒有錯。該問題出現在基於類的視圖中,在基於函數的通用視圖中它完美地工作。由於django引入了基於類的[通用]視圖,因此使用它們似乎是正確的。 – seler

相關問題