当前位置: 首页 > 面试题库 >

在Django模板中执行getattr()样式查找

鲁辉
2023-03-14
问题内容

当你事先不知道某个属性的名称时,Python的getattr()方法很有用。

此功能也将在模板中派上用场,但我从未想出实现此目的的方法。是否存在可以执行动态属性查找的内置标记或非内置标记?


问题答案:

最近,我还必须将此代码编写为自定义模板标签。要处理所有查找方案,它首先进行标准的属性查找,然后尝试进行字典查找,然后尝试进行getitem查找(以使列表起作用),然后在对象为对象时遵循标准的Django模板行为。未找到。

(更新2009-08-26现在也可以处理列表索引查找)

# app/templatetags/getattribute.py

import re
from django import template
from django.conf import settings

numeric_test = re.compile("^\d+$")
register = template.Library()

def getattribute(value, arg):
    """Gets an attribute of an object dynamically from a string name"""

    if hasattr(value, str(arg)):
        return getattr(value, arg)
    elif hasattr(value, 'has_key') and value.has_key(arg):
        return value[arg]
    elif numeric_test.match(str(arg)) and len(value) > int(arg):
        return value[int(arg)]
    else:
        return settings.TEMPLATE_STRING_IF_INVALID

register.filter('getattribute', getattribute)

模板用法:

{% load getattribute %}
{{ object|getattribute:dynamic_string_var }}


 类似资料:
  • 问题内容: 我需要从Django模板中执行过滤查询,以获取与视图中的python代码等效的一组对象: 在我的模板中,我想做 但我似乎无法找出如何编写FILTER。 问题答案: 你不能这样做,这是设计使然。Django框架的作者打算将表示代码与数据逻辑严格分开。过滤模型是数据逻辑,而输出HTML是表示逻辑。 因此,你有几种选择。最简单的方法是进行过滤,然后将结果传递给。或者,你可以在模型中编写一个方

  • 问题内容: 我正在尝试格式化数字。例子: 它很常见,但是我不知道该使用哪个过滤器。 编辑:如果你有通用的Python方法可以执行此操作,那么很高兴在模型中添加一个格式化字段。 问题答案: Django的贡献人性化应用程序可以做到这一点: 确保将文件添加到列表中。

  • 我创建了新项目,但找不到出错的地方。 Django versiob - 3.1.5 蟒蛇 3.7.4 模板DoesNotExist位于/index。html请求方法:GET请求URL:http://127.0.0.1:8000/Django版本:3.1.5异常类型:TemplateDoesNotExist异常值: 索引。html异常位置:C:\Users\user\PycharmProjects\

  • 问题内容: 我可以在Django的模板中使用Auth应用程序的权限检查吗?(我想在模板的末尾为特权用户显示一个简单的表单) 更重要的是,我是否应该这样做,或者这不是“ Django方式”吗? 问题答案: 如果你要检查模板中的权限,则以下代码就足够了: 其中,模型是指用户需要权限才能查看表单的模型。 有关更多示例,请参阅https://docs.djangoproject.com/en/stable

  • 我试图使用Django将PostgreSQL表提取到HTML中,当我在PostgreSQL的查询工具中执行空间查询时,我得到了完美的结果,但当我试图从Django执行相同的脚本时,我得到了所有的数据行。谢谢你提前帮忙。 姜戈剧本 HTML

  • 问题内容: 这可能无关紧要,只是想问一下, 如果一个对象从视图传递到模板,并且在模板中我将能够查询许多字段 型号代码: 观看次数: 在模板中可以解码多对多字段,因为我们正在传递对象 谢谢.. 问题答案: 通常,您可以通过django模板系统中的路径来跟踪任何不带参数的属性或方法调用。 对于上面的视图代码,类似 应该做您期望的。 (我无法完全从代码示例中找出具体细节,但希望这会阐明您可以从模板中学到