【问题标题】:Django Templates: Is there a way to query a specific object based on its property (instead of iterating over all)?Django 模板:有没有办法根据其属性查询特定对象(而不是遍历所有对象)?
【发布时间】: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/…

标签: python django templates


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 2021-12-14
    • 2018-04-23
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多