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

ism*_*ail 2 django django-templates django-models

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

Date | Time | Description
10/05/2010 | 13:30 | Testing...
Run Code Online (Sandbox Code Playgroud)

ETC...

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

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

我考虑过使用新的 if 标签(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 ''
Run Code Online (Sandbox Code Playgroud)

但是它仍然显示来自数据库的结果,这与模板的“惰性”评估有什么关系吗?

谢谢!

更新响应下面的评论:它在数据库中没有存储错误,它存储正确但是有一个小的侧面情况,该值需要更改。

例如,我有一个“起始日期”和“截止日期”,我的查询会检查今天的日期是否在这些日期之间。现在,他们可以设置一整年的从日期到日期,并且可以处理特殊情况(例如星期一)。但是,如果您想存储在数据库中,则必须捕获更多记录以满足副情况。也就是说,您将捕获相同的信息,只是为了满足时间变化的那一天的需要。(并且时间总是在同一天发生变化,并且始终相同)

使用解决方案更新(基于下面 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
Run Code Online (Sandbox Code Playgroud)

并在模板中

   {{ object.get_corrected_time|time:"P" }}
Run Code Online (Sandbox Code Playgroud)

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

Kil*_*nDS 5

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

@property
def get_corrected_time(self):
    if today_is_monday:
        return '13:30'
    return str(self.time)
Run Code Online (Sandbox Code Playgroud)

在您的模板中,您可以完美地将其称为 {{ object.get_ Corrected_time }}

现在我在模板标记中看到您只想在查询集中的第一个元素上执行此操作,您可以在模板中轻松执行此操作(您也可以在视图方法中执行此操作):

{% for object in list %}
{% if forloop.first %}
    {{ object.get_corrected_time }}
{% else %}
    {{ object.time }}
{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)