我在视图中定义一个变量,如下所示:
{{import datetime}}
{{top10 = db( db.table.date > datetime.datetime.now() ).select()[:10]}}
然后继续使用该变量。
由于这是在视图中我想扩展我宁愿不在控制器中定义该变量然后传递它,这就是我实现的原因。
我也不喜欢我在视图中导入内容。
是否有(a)在视图中导入(b)在视图中定义变量的替代方法?如果这是一个好习惯,我很乐意保留它。
谢谢!
答案 0 :(得分:3)
您在模型文件中添加到环境中的任何内容都将在视图中提供,因此您可以在任何模型文件中包含import语句。但是,我认为没有任何理由不在视图中进行导入,因为模块实际上在那里使用(而不是在模型文件中),这可能更有意义。
如果您的目标是最小化视图中的逻辑,那么更好的方法可能是将两条线移动到模型文件中(如果您只需要top10
变量,则可以使用conditional models特殊控制器/功能)。
此外,在这种情况下,您确实不需要datetime
模块,因为您可以使用request.now
代替datetime.datetime.now()
(唯一的区别是request.now
将在几毫秒之前计算,因为它的值由请求开始时的框架填充。)
此外,通过使用limitby
将select限制为前10条记录,而不是选择所有匹配的记录,然后使用Python提取前10条记录,可以提高数据库查询效率:
top10 = db(db.table.date > request.now).select(limitby=(0, 10))
最后,如果排名前10的记录不经常更改,您可以考虑caching the select。