Django - 在模板中过滤RelatedManager _set?

时间:2011-11-02 05:55:27

标签: django templates filter

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

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

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

然而,问题是这会将所有相关的房间带到一个网站 - 但是,我们需要通过另一个属性来缩小此设置(让我们称之为{{1} }) - 此属性存储在Django会话变量中。

目前,我们只是在视图代码中使用year,这很好。

我的问题更多来自好奇心 - 有没有办法在模板中使用Room.objects.filter(site=some_site, year='2009'),还是过滤或缩小集合?

您是否可以编写自定义模型管理器来执行此操作,以便_set只返回当前年份的对象?或者还有其他方式吗?

干杯, 维克多

1 个答案:

答案 0 :(得分:3)

  

我的问题更多来自好奇心 - 有没有办法使用_set   模板,仍然过滤或缩小集合?

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

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

对于#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)