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”

Django模板标签搜索通过for循环寻找特定对象,如果没有找到则默认

Django如何在查询集中标记用户特定的对象以发送到模板?

在 django 中,我想在已经排序的查询集中获取特定元素及其几个邻居