Django 模板:有没有办法根据其属性查询特定对象(而不是遍历所有对象)?
Posted
技术标签:
【中文标题】Django 模板:有没有办法根据其属性查询特定对象(而不是遍历所有对象)?【英文标题】:Django Templates: Is there a way to query a specific object based on its property (instead of iterating over all)? 【发布时间】:2014-02-06 04:00:28 【问题描述】:假设我有一个对象“用户”作为上下文进入,我知道它包含许多用户对象。现在,在我的模板中,我想访问一个我知道具有特定属性值的特定用户(假设 id 为 10),然后显示与该用户关联的另一个属性。我知道我能做到:
% for user in users %
% if user.id == 10 %
user.age
% endif %
% endfor %
我知道我可以在我的视图中提取该用户并只传递一个对象 (?) 但在这种情况下,拥有所有这些对象是有意义的。
我觉得应该有一种更简单的方法来做到这一点,但我是 Django/模板新手。尝试搜索但不知道如何表达它..
【问题讨论】:
当你只关心一个时,拥有所有这些有什么意义? @Ignacio:根据我的帖子,我需要所有这些用于其他显示目的。在我的情况下,它不是真正的用户(我用它作为一个简单的例子)——我需要获取不同订阅计划的定价信息,以显示在它们各自的更新/升级按钮下(它们本身是根据其他条件显示的).. 我会亲自在视图中处理这个问题,这样你至少可以为逻辑编写单元测试。将大量逻辑直接放入模板中会使其更难重用并保持代码干燥:programmer.97things.oreilly.com/wiki/index.php/… 【参考方案1】:这确实是模板标签的工作
模板标签/my_tags.py
...
@register.filter
def where_id(users,user_id):
return filter(lambda u:u.pk==user_id,users)
...
sometemplate.html
%load my_tags %
...
% for user in users|where_id:10 %
....
【讨论】:
谢谢,昨天正在查看标签和过滤器文档。尝试按照上述实现,但出现语法错误。我还不知道“lambdas”——有人愿意翻译成非 lambda 代码吗? :) @pete 相当于def foo(x): return x.pk==user_id
,其中user_id
是一个全局变量
你必须使用from django.template import Library; register = Library()
。
是的,我明白了,谢谢。我收到“/account/pk 处的 AttributeError”。在我的例子中,我过滤的属性是一个字符串。它会破坏您的解决方案吗?
a) 这不是我的解决方案(我的是下面的那个),b) 如果您选择使用此解决方案,您必须将 u.pk
更改为 u.<your_fieldname>
【参考方案2】:
如果您使用的是唯一字段,最好使用get
,而不是filter
。这是一种通用的方法,灵感来自 Joran 的回答和this answer。
my_template.html:
%load my_tags %
...
This is the user with pk=1: users|get:"pk, 1"
....
templatetags/my_tags.py:
from django.template import Library
from django.core.exceptions import ObjectDoesNotExist
register = Library()
@register.filter
def get(models, argstring):
args = argstring.split(',')
if len(args) != 2:
raise ValueError("Exactly two arguments required, separated by comma")
field, value = args
try:
return models.get(**field: value)
except ObjectDoesNotExist:
return None
【讨论】:
以上是关于Django 模板:有没有办法根据其属性查询特定对象(而不是遍历所有对象)?的主要内容,如果未能解决你的问题,请参考以下文章
当查询被填充时,有没有办法在 Django 模板中呈现大型查询集?
有没有办法将 Django 模型查询集转换为模板中的 json 或 json 字符串?
django 模板中的 for 循环 - 列表对象没有属性“get”