是否可以在将查询集中的值发送到模板之前替换它们?

时间:2010-04-23 20:13:23

标签: django django-models django-templates

想知道在将其发送到模板之前是否可以更改从查询集返回的值。 比方说,你有一堆记录

Date | Time | Description
10/05/2010 | 13:30 | Testing...

等...

但是,根据星期几,时间可能会发生变化。然而,这是静态的。例如,在星期一,时间总是15:00。

现在你可以添加另一个表来配置特殊情况,但对我来说这似乎有些过分,因为这是一个规则。在将该值发送到模板之前,您将如何替换该值?

我考虑使用新的if标签(如果day = 1),但这更多是业务逻辑而不是演示。

在自定义模板标记

中对此进行了测试
def render(self, context):
    result = self.model._default_manager.filter(from_date__lte=self.now).filter(to_date__gte=self.now)
    if self.day == 4:
        result = result.exclude(type__exact=2).order_by('time')
    else:
        result = result.order_by('type')
    result[0].time = '23:23:23'
    context[self.varname] = result
    return ''

然而,它仍然显示来自数据库的结果,这是否与模板的“懒惰”评估有何关联?

谢谢!

更新回复以下评论: 它没有在DB中存储错误,它存储正确但是有一个小的情况需要改变值。

所以例如我有一个From Date&到目前为止,我的查询检查今天的日期是否在这些之间。现在有了这个,他们可以建立一个从日期到现在整整一年,特殊情况(如星期一作为一个例子)得到照顾。但是,如果要存储在数据库中,则必须捕获更多记录以满足侧面情况。即,您将捕获相同的信息,以满足时间变化时的那一天。 (而且时间总是在同一天变化,并且总是相同的)

使用解决方案更新(基于以下KillianDS的回答) 在models.py中,我定义了一个自定义属性:

@property
def get_corrected_time(self):
    from datetime import time
    day = datetime.now().weekday()
    if day == 0 or day == 1:
        self.time = time(12,30)
    return self.time

并在模板中

   {{ object.get_corrected_time|time:"P" }}

返回datetime.time对象而不是字符串的原因是,django的默认日期&时间过滤器不适用于字符串。

1 个答案:

答案 0 :(得分:4)

好的,没有任何确切的例子(一个简单的模型和明确的用例会有所帮助),我真的不能确定,但​​我想这就是你想要做的。在模型定义中,添加如下内容:

@property
def get_corrected_time(self):
    if today_is_monday:
        return '13:30'
    return str(self.time)
在模板中

,您可以将其称为{{object.get_corrected_time}}

现在我在你的模板标签中看到你想要这样做,例如只在查询集的第一个元素上,你可以在模板中轻松地做到这一点(你也可以在view方法中做到):

{% for object in list %}
{% if forloop.first %}
    {{ object.get_corrected_time }}
{% else %}
    {{ object.time }}
{% endif %}
{% endfor %}