2011-06-12 70 views
1

我一直在閱讀其他答案,但我仍然不理解什麼是使用多個視圖的通用代碼最快和最好的方法。Django在視圖中的通用代碼

比方說,我有這個代碼反映了用戶的觀點,我想在許多視圖中顯示。

if(request.user.is_authenticated()): 
    # UserLove 
    userLove = 0 
    ul = Love.objects.filter(user=request.user.id) 
    for u in ul: 
     userLove += u.amount 
else: 
    userLove= 0 

我看到了關於使用裝飾器的文字。我聽說過通用視圖和分類視圖,還有人提到了context processors

你能告訴我哪個是最好的,如果我以View1和View2爲例,我的代碼將如何查看。感謝名單!

回答

2

不知道我同意,無論是裝飾或模板標籤在這裏最好的辦法。裝飾器適用於函數(即視圖),因此,例如,如果您想確保用戶在訪問視圖前已登錄,則可以使用裝飾器。但不是用於確定裏面的的功能。

如果你有,你想重新使用在幾個地方,一個代碼塊只是使它成爲一個獨立的功能,也許在公用事業文件,然後導入該功能。例如:

# myapps.utilities.py 
from models import Love 
def computeLove(request): 
    # code for determining value here 
    return LoveValue 

# someView.py 
from myapps.utilities import computeLove 

def showRatings(request): 
    lv = computeLove(request) 

這是一種標準的編程方法,您並不需要任何特定的Django功能。

+0

這是我如何做到的,它的效果很好。然而,令我困擾的是,在Django 1.3之前,通用視圖是作爲函數實現的。基於功能的實現已被棄用,以支持這裏描述的基於類的方法。「https://docs.djangoproject.com/en/dev/topics/class-based-views/ – mgPePe 2011-06-14 12:16:34

+1

@ mgPePe,有兩個這裏涉及的不同事物 - 一個* view *和一個*通用的代碼塊*。視圖只是一個接受請求對象並返回某種HTTP響應的函數。無論它是作爲獨立函數還是類的一部分實現,都與實現一個*通用的代碼塊*無關。 – 2011-06-14 12:36:08

0

好吧,也許你需要別的東西,但在你的情況下,你可以使用模板標籤做這件事情,例如:

在應用程序的名字

/util.py你必須編寫代碼,這將返回數據的一部分你需要。 然後在模板標籤,你這樣做

# appname_tags.py 
from django import template 
from appname.util import get_rating 

register = template.Library() 

@register.simple_tag 
def user_rating(user): 
    rating = get_rating(user) 
    return rating if rating is not None else '' 

所以在你的模板文件:

{% load appname_tags %} 

{% user_rating anyuser %}