2011-05-13 27 views
3

問題是,在某些視圖中,我手動獲取感興趣的上下文變量(讓我們說「G」),因爲我用它來查找該特定視圖中的其他信息(即視圖A,B,C),但是其他視圖(即X,Y,Z),我需要獲取特定的上下文變量,因爲此上下文將在我的項目中的每個視圖中可用(因爲我的基本模板使用上下文變量)。使用自定義上下文處理器的問題在於,我相信它會在視圖(A,B,C)中進行額外的IDENTICAL DB調用,因爲這些視圖已獲取該上下文變量,因爲需要在視圖中獲取其他數據。我在想的可能是我可以實現一個上下文處理器來檢查給定的請求是否設置了特定的上下文變量。這可能嗎?有更簡單的解決方案嗎?下面的代碼可能會爲有些人澄清這個問題。是否可以檢查一個上下文變量是否已經在自定義上下文處理器定義的視圖中設置?

謝謝你的任何建議!

def viewA(request): 
    g=G.objects.get(user=request.user) 
    posts = Post.objects.filter(g=g) 
    return direct_to_template(request,'something.html',{'G':g, 'posts':posts}) 

def viewX(request): 
    stuff = Albums.objects.get(user=request.user) 
    return direct_to_template(request,'something2.html',{'stuff':stuff}) 

def my_context_processor(request): #redundant in case of viewA (hits db again?) 
    return {'G':G.objects.get(user=request.user)} 

def ideal_processor(request): 
    #check context vars to see if G is already in there 
    #if it is, return {}, else, return {'G':G.objects.get(user=request.user)} 
+0

「使用自定義上下文處理器的問題是,我相信它會進行額外的和相同的數據庫調用」?爲什麼? Django有一個緩存管理器。你有沒有檢查你的數據庫日誌,看看是否屬實? – 2011-05-13 19:24:54

回答

0

我只是做中間件設置variabel克至request.G,因爲我需要它在幾乎每個請求反正。即:

class GuildMiddleware(object): 
    def process_request(self, request): 
     request.G = figure_out_what_G_is() 
     return None 

現在你(如果你使用使用direct_to_template,RequestContext的,等和模板)可以使用request.G在視圖中的任何地方。

0
def always_G(request): 
    if not hasattr(request, 'G'): 
     {'G':G.objects.get(user=request.user)} 
+0

您錯過了默認回報。上下文處理器*必須*返回一些東西,所以你需要添加'else:return {}' – 2011-05-13 20:46:11

+0

這是行不通的,我試過了代碼,並且請求從來沒有屬性「G」,即使它應該。我不認爲你可以訪問那樣的上下文。如我錯了請糾正我! – user701632 2011-05-26 07:30:55

相關問題