【问题标题】:Django - filtering RelatedManager _set in template?Django - 在模板中过滤 RelatedManager _set?
【发布时间】:2011-12-20 01:16:18
【问题描述】:

我们有一个 Django DetailView,我们在其中显示一个对象 (Site),以及它的所有相关对象 (Rooms)。

现在,在模板中,我们可以简单地遍历 RelatedManager 集:

{% for room in site.room_set.all %}
    do stuff
{% endfor %}

但是,这样做的问题是,这会将 所有 相关房间拾取到一个站点 - 但是,我们需要通过另一个属性稍微缩小这个范围(我们称之为 year) - 此属性存储在 Django 会话变量中。

目前,我们只是在视图代码中使用Room.objects.filter(site=some_site, year='2009'),这很好。

我的问题更多是出于好奇——有什么方法可以在模板中使用_set,并且仍然过滤或缩小集合?

您能否编写一个自定义模型管理器来执行此操作,以便 _set 将只返回当年的对象?还是有其他方法?

干杯, 维克多

【问题讨论】:

    标签: django templates filter


    【解决方案1】:

    我的问题更多是出于好奇 - 有什么方法可以使用 _set in 模板,并且仍然过滤或缩小集合?

    默认情况下不是,因为无法将参数传递给过滤器调用。

    • 如果需要重复可变、经常且与模板相关的功能:构建自定义模板标签或过滤器(可以接受参数)。
    • 如果是特定于视图的功能,请在视图中对其进行编码。
    • 如果多个视图的功能相同,请在干燥的地方构建该功能。

    对于#3,有很多因素决定了这段代码应该去哪里,所以没有通用的解决方案。您可以将功能导入您的视图吗?使用模型管理器?模型实例方法?上下文处理器?等等。

    您能否编写一个自定义模型管理器来执行此操作,以便 _set 将 只返回当年的对象?或者有没有其他的 怎么办?

    看起来你实际上可以只为你的反向相关模型使用模型管理器。

    class RoomManager(models.Manager):
        def current_year(self):
            return self.get_queryset().filter(year=datetime.date.today().year)
    
    for room in site.room_set.current_year():
       ...
    

    或者只是在父模型上:

    class Site(models.Model):
        ...
        def year_room_set(self):
            return self.room_set.filter(year=datetime.date.today().year)
    

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 2018-03-01
      • 2012-01-28
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2020-02-16
      • 2017-03-29
      相关资源
      最近更新 更多