2011-12-30 56 views
0

我想寫一個上下文處理器,其將查找現有的上下文中,並且如果有一個存在形式,檢查用戶是否有權限來編輯該對象。如果不是,我將覆蓋該上下文變量。Django的上下文處理器以檢查用戶權限

如何閱讀從上下文處理器內部現有的情況下?

編輯: 之所以使用這種類型的上下文處理器的是避免與如果在每個視圖語句具有檢查權限。一些用戶將擁有讀/寫訪問權限,其他用戶將擁有隻讀權限,而其他用戶則無權訪問對象級別的權限。我希望在視圖處理後相應地操作表單。

+0

請定義*有權編輯該對象* – jpic 2011-12-30 17:43:55

+0

權限將對象級權限包處理。最有可能的是django-rulez。 – AgDude 2011-12-30 19:10:07

回答

4

爲什麼不只是包裝用user_passes_test裝飾的看法?你可以在那裏運行你喜歡的任何檢查 - 不需要黑客。

+0

user_passes_test不會完成我想要的,因爲某些用戶可能具有隻讀訪問權限。也許我可以寫一個裝飾器,在某些情況下可以使表單只讀。我需要閱讀裝飾器。 – AgDude 2011-12-30 19:23:55

+0

請閱讀裝修。對所有的URL進行迭代並且修飾所有的視圖,而不是猴子補丁(這就是當我談到「不太聰明」時所想到的)。但最有說服力的是,我可以保證立即滿足學習做裝飾。你會給你的代碼一個你沒有經歷過的優雅,直到你可以做裝飾。 – jpic 2011-12-30 22:04:27

+0

感謝您指點我正確的方向。我將使用[此處]描述的方法來處理我的一些基本視圖(http://blog.vmfarms.com/2010/01/helpful-django-view-decorator-pattern.html)。這似乎是一個非常乾燥的選擇。 – AgDude 2012-01-02 13:38:25

1

您應該使用django-authority,或any authority package。雖然我不能保證他們自己不依賴黑客,但至少你不會獨自使用黑客。這就是說,這裏是一個可行的解決方案,以您的問題:

  1. 猴子補丁django.template.base.RequestContext,設置request.context =自我。

  2. 創建一個模板,背景處理器,可同時使用request.context

  3. 添加上下文處理器設置,你是好去

這裏是一個例如,你可以在settings.py中粘貼它,它可以工作:

def print_context(request): 
    print request.context.get('form', 'No form in this context') 
    return {} 

from django.template.base import RequestContext 
orig_init = RequestContext.__init__ 
def new_init(self, request, **kwargs):           
    request.context = self 
    orig_init(self, request, **kwargs)           
RequestContext.__init__ = new_init 

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth',          
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n',          
    'django.core.context_processors.media', 
    'django.core.context_processors.request', 
    'settings.print_context', 
) 

請注意,您正在使用Django的設計,我發佈了這個答案,假設您知道您在做什麼 - 您知道Python和Django都很好。

+0

我已經忽略了django-authority,因爲它在bitbucket上看起來並不活躍,但我會再看一次。我同意我寧願不要單獨使用像你提到的那樣的黑客。 – AgDude 2011-12-30 19:17:34

+0

感謝您的詳細回覆。你說服了我,情境處理器不是處理這個問題的最好方法。 – AgDude 2012-01-02 13:35:38