Django模板如何使用变量查找字典值

2024-12-06 08:40:00
admin
原创
129
摘要:问题描述:mydict = {"key1":"value1", "key2":"value2"} 在 Django 模板中查找字典值的常规方法是{{ mydict.key1 }}, {{ mydict.key2 }}。如果键是循环...

问题描述:

mydict = {"key1":"value1", "key2":"value2"}

在 Django 模板中查找字典值的常规方法是{{ mydict.key1 }}, {{ mydict.key2 }}。如果键是循环变量怎么办?即:

{% for item in list %} # where item has an attribute NAME
  {{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}

mydict.item.NAME失败。如何修复?


解决方案 1:

编写自定义模板过滤器:

from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

(我使用.get这样的方式来实现,如果键不存在,它就返回 none。如果你这样做,dictionary[key]它就会引发一个KeyErrorthen。)

用法:

{{ mydict|get_item:item.NAME }}

解决方案 2:

在循环中从字典中获取键和值:

{% for key, value in mydict.items %}
    {{ value }}
{% endfor %}

我发现这更容易阅读,并且避免了特殊编码的需要。无论如何,我通常需要循环内的键和值。

解决方案 3:

默认情况下您不能这样做。点是属性查找/键查找/切片的分隔符/触发器。

点在模板渲染中具有特殊含义。变量名中的点表示查找。具体来说,当模板系统在变量名中遇到点时,它会按以下顺序尝试以下查找:

  • 字典查找。示例:foo["bar"]

  • 属性查找。示例:foo.bar

  • 列表索引查找。示例:foo[bar]

但是你可以创建一个过滤器来传递一个参数:

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

@register.filter(name='lookup')
def lookup(value, arg):
    return value[arg]

{{ mydict|lookup:item.name }}

解决方案 4:

对于我来说,创建一个名为“我的应用程序”的python文件template_filters.py,其中包含以下内容

# coding=utf-8
from django.template.base import Library

register = Library()


@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

用法就像 culebrón 所说的那样:

{{ mydict|get_item:item.NAME }}

解决方案 5:

环境:Django 2.2

  1. 示例代码:



    from django.template.defaulttags import register

    @register.filter(name='lookup')
    def lookup(value, arg):
        return value.get(arg)

我把这段代码放在项目文件夹 portfoliomgr 中名为 template_filters.py 的文件中。

  1. 无论你将过滤器代码放在哪里,请确保该文件夹中有__init__.py

  2. 将该文件添加到 projectfolder/settings.py 文件中的 templates 部分中的 libraries 部分。对我来说,它是 portfoliomgr/settings.py



    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
                'libraries':{
                    'template_filters': 'portfoliomgr.template_filters',
                }
            },
        },
    ]

  1. 在你的 html 代码中加载库


{% load template_filters %}

解决方案 6:

我遇到过类似的情况。但是我使用了不同的解决方案。

在我的模型中,我创建了一个执行字典查找的属性。然后在模板中我使用该属性。

在我的模型中:-

@property
def state_(self):
    """ Return the text of the state rather than an integer """
    return self.STATE[self.state]

在我的模板中:-

The state is: {{ item.state_ }}

解决方案 7:

由于我无法评论,让我以答案的形式来做这件事:

以culebrón 的答案或Yuji 'Tomita' Tomita 的答案为基础,传递给函数的字典是字符串的形式,因此也许首先使用ast.literal_eval将字符串转换为字典,就像在本例中一样。

经过此编辑,代码应如下所示:

# code for custom template tag
@register.filter(name='lookup')
def lookup(value, arg):
    value_dict = ast.literal_eval(value)
    return value_dict.get(arg)
<!--template tag (in the template)-->
{{ mydict|lookup:item.name }}

解决方案 8:

11年后。

您可以将此文档用于 4.2 https://docs.djangoproject.com/en/4.2/howto/custom-template-tags/

视图.py

from django.template.defaultfilters import register
@register.simple_tag
def example_tag(var_1, var_2, *args, **kwargs):
    args_1 = kwargs["args_1"]
    args_2 = kwargs["args_2"]

    return args_1+" "+ args_2

例子.html

{% example_tag variable_1 variable_2 args_1="hi" args_2="hello" %}

输出

hi hello

解决方案 9:

接受的答案很好,但我只想添加如何使用过滤器链深入研究嵌套值

mydict = {"USD": { "amount": 30 }, "JPY": { "amount": 3000 }}
currency = "JPY"
{{ mydict|get_item:currency|get_item:"amount" }}

输出将是3000

解决方案 10:

不要。Django 尚未实现任意字典查找,但有充分的理由。

不这样做的主要原因是模板中需要这种逻辑的逻辑通常是业务逻辑。这种逻辑不属于模板,而应该移至视图。

另一个问题是 Django 的模板引擎效率不高:它需要大量的上下文解析和渲染逻辑,这意味着这样的字典查找不是“免费的”,这些会减慢渲染速度,特别是在循环中完成时。

通常它还需要解析作为键的变量,这会使调试更加棘手,因为上下文解析的结果可能不是人们所期望的。例如,如果未找到变量,它将使用值string_if_invalid[  Django-doc],这本身并不是人们想要的,因此该行为可能会产生结果,但却是错误的结果。

最后,如果发生错误,则会使调试变得更加困难,并且如果出现问题,则可能会将其默默传递,而如果出现故障,通常最好至少在某处记录它。

如果你需要执行任意下标或属性查找,这意味着你应该将逻辑从模板移到视图实际上,在这种情况下,你可以在视图中准备数据,例如这里:

def my_view(request):
    my_list = ['key2']
    my_dict = {'key1': 'value1', 'key2': 'value2'}
    result = [my_dict[k] for k in my_list]
    return render(request, 'name-of-template.html', {'result': result})

然后在模板中处理,而不是带有和的result逻辑。my_dictmy_list

解决方案 11:

如果您的字典有一组固定的键,那么 Python 相对较新的数据类提供了一种优雅的方法来做到这一点。

为你的字典创建一个数据类

@dataclass
class MyObject:
    key_1: str
    key_2: str

然后在将字典传递给模板之前对其进行变形。因此可能在 get_conetxt_data() 中。

context.update({"mydict" :MyObject(**mydict)})

然后您就可以在模板中使用点符号访问值。

{{ mydict.key_1 }}

解决方案 12:

环境:django 2.1.7

看法:

dict_objs[query_obj.id] = {'obj': query_obj, 'tag': str_tag}
return render(request, 'obj.html', {'dict_objs': dict_objs})

模板:

{% for obj_id,dict_obj in dict_objs.items %}
<td>{{ dict_obj.obj.obj_name }}</td>
<td style="display:none">{{ obj_id }}</td>
<td>{{ forloop.counter }}</td>
<td>{{ dict_obj.obj.update_timestamp|date:"Y-m-d H:i:s"}}</td>
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用