【问题标题】:Django: check for generic type in template?Django:检查模板中的泛型类型?
【发布时间】:2010-02-22 02:05:24
【问题描述】:

我在我的 Profile 模型中使用泛型类型:

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

但现在我想从我的模板中检查用户是否属于某种类型。我可以使用{{ user.get_profile.user_type }} 获取用户类型,但那又如何呢?或者我将如何向模型添加一个方法,例如is_type_xxx,以便我可以在模板中使用它?

【问题讨论】:

    标签: django django-models django-templates


    【解决方案1】:

    也许我不完全理解这个问题,但似乎你可以在你的模型中定义一个函数,如果类型是你需要的,则返回 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 %}
    

    【讨论】:

    • 更准确地说是return self.user_type == ContentType.objects.get_for_model(type),但你是对的。
    【解决方案2】:

    user_type 是一个ForeignKey 到一个ContentType model,所以像对待任何关系一样对待它。

    【讨论】:

      【解决方案3】:

      虽然 Ignacio 基本上是正确的,但我发现如果你不小心的话,可能会有很多意外的 DB 命中的趋势。由于ContentTypes 的数量往往很小且相对不变,因此我缓存了名称/ID 对的字典以避免它。您可以使用信号来更新您的字典,以防创建新的 ContentType。

      然后您可以根据需要自动创建必要的is_type_xxx() 函数/方法。有点笨拙,但代码不是很复杂。

      【讨论】:

      • 假设框架已经缓存了内容类型以最小化数据库命中。
      • 是的,据说。您是否运行过数据库查询统计信息并进行了检查?而且由于您不能在 Django 的模板“语言”中传递参数,您仍然需要(手动或自动)创建所有必要的 is_type_xxx() 方法,ORM 将不会为您做一些事情.我们有一个应用程序,其中有 150 多个 ContentTypes(动态添加更多),因此一次提取整个混乱并构建 dict 和类型测试方法要便宜得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 2021-01-18
      • 2020-09-18
      • 2016-10-10
      • 1970-01-01
      • 2018-11-23
      • 2023-04-05
      相关资源
      最近更新 更多