2010-02-22 65 views
0

我使用泛型我Profile模型:Django:檢查模板中的泛型類型?

user_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
details = generic.GenericForeignKey('user_type', 'object_id') 

但現在我要檢查,如果用戶是某一類型從我的模板中。我可以通過{{ user.get_profile.user_type }}獲得用戶類型,但是什麼?或者,我如何將模型添加到is_type_xxx這樣的模型中,以便我可以在模板中使用它?

回答

2

也許我不完全理解的問題,但似乎你可以定義你的模型,則返回true函數如果類型是你所需要的,那麼你可以調用該函數從模板,就像你如果你正在訪問一個變量。

在模型...

user_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
details = generic.GenericForeignKey('user_type', 'object_id') 

def IsTypeX(): 
    return user_type == x 

在模板...

{% if user.get_profile.IsTypeX %} 
{% endif %} 
+0

更確切地說'回報self.user_type == ContentType.objects.get_for_model(型)'但你說得對。 – mpen 2010-02-22 03:02:19

1

user_type是一個ForeignKeyContentType model,所以對待它,因爲你會任何關係。

1

雖然伊格納西奧基本上是正確的,我覺得有可能是,如果你不小心意外DB命中一個真正的趨勢得到了很多。由於ContentTypes的數量往往很小且相對不變,我緩存一個名稱/ ID對的字典以避免它。您可以使用信號來更新您的字典,以避免創建新的ContentType。

然後,您可以根據需要自動創建必要的is_type_xxx()函數/方法。這有點快樂,但代碼不是很複雜。

+0

據說框架已緩存的內容類型,以儘量減少數據庫命中。 – mpen 2010-02-22 02:55:05

+0

是的,據說。你運行數據庫查詢統計信息並檢查?而且因爲你不能傳遞Django的模板「語言」 ARGS你仍然需要創建(手動或自動)所有必要的'is_type_xxx的()'方法,東西ORM將*不*爲你做。我們有一個應用程序,其中有超過150個CONTENTTYPES(與上飛更增添了),所以它的便宜很多事情要做整個混亂的一個獲取和建設字典和類型的測試方法。 – 2010-02-22 05:13:12