2010-02-22 37 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