想知道在将查询集返回的值发送到模板之前是否可以更改它。比如说你有一堆记录
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) def winner(p1, p2)
wins = {rock: :scissors, scissors: :paper, paper: :rock}
{true => p1, false => p2}[wins[p1] == p2]
end
Run Code Online (Sandbox Code Playgroud)
忙着一些代码,并且有一个函数,它基本上需要每个值都是列表的字典,并返回具有最大列表的键.
我写了以下内容:
def max_list(dic):
if dic:
l1 = dic.values()
l1 = map(len, l1)
l2 = dic.keys()
return l2[l1.index(max(l1))]
else:
return None
Run Code Online (Sandbox Code Playgroud)
其他人写了以下内容:
def max_list(dic):
result = None
maxValue = 0
for key in dic.keys():
if len(dic[key]) >= maxValue:
result = key
maxValue = len(dic[key])
return result
Run Code Online (Sandbox Code Playgroud)
如果有的话,这将是"正确"的方法.我希望这不被视为社区维基(即使代码有效),试图找出哪个是问题最好的模式.
一些python代码不断抛出无效的语法错误:
stat.sort(lambda x1, y1: 1 if x1.created_at < y1.created_at else -1)
Run Code Online (Sandbox Code Playgroud) 我知道django故意不允许模板中有很多逻辑.但是,有时您需要评估某些内容并根据更改您的选项.
如何更改模板中的值或仅在第一条记录中插入内容?但是你仍然想要完成其余的工作.例如,我的模板代码如下:
{% for object in object_list %}
<div id="t{{ object.id }}-header" class="content_headings title_highlight" >{{ object.title }}</div>
<div id="t{{ object.id }}-content">
......
Run Code Online (Sandbox Code Playgroud)
PHP模板中的类似代码:
<div id="t<?php if ($i != 1) { echo $i-1; } ?>-header" class="content_headings<?php if ($i == 1) { ?> title_highlight<?php } ?>" ><?php the_title(); ?></div>
<div id="t<?php if ($i != 1) { echo $i-1; } ?>-content">
Run Code Online (Sandbox Code Playgroud) 收到以下错误:
syntax error, unexpected keyword_ensure, expecting keyword_end
Run Code Online (Sandbox Code Playgroud)
和
syntax error, unexpected $end, expecting keyword_end
Run Code Online (Sandbox Code Playgroud)
用代码
<% if user.admin? do %>
<%= form_tag({:controller => '/admin/link', :action=> 'link', :id => @link.id}) do %>
<%= render :partial => "link_form" %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
虽然我已经完成了大约10次代码,但我的所有块都已关闭.答案可能很容易,因为我是一个红宝石/新手.代码也不是很难,只有大约15行.