想知道在将其发送到模板之前是否可以更改从查询集返回的值。 比方说,你有一堆记录
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的默认日期&时间过滤器不适用于字符串。
答案 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 %}