Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模板如何使用变量查找字典值_Python_Django_Templates_Dictionary - Fatal编程技术网

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

Python Django模板如何使用变量查找字典值,python,django,templates,dictionary,Python,Django,Templates,Dictionary,在Django模板中查找字典值的常规方法是{{mydict.key1}}、{{mydict.key2}。如果键是一个循环变量怎么办?即: mydict = {"key1":"value1", "key2":"value2"} mydict.item.NAME失败。如何修复此问题?默认情况下,您不能。点是属性查找/键查找/切片的分隔符/触发器 点在模板渲染中具有特殊意义。变量中的点 名称表示查找。具体来说,当模板系统 遇到变量名中的点,它会尝试以下查找, 按此顺序: 查字典。示例:foo[bar

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

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

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

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

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

查字典。示例:foo[bar] 属性查找。示例:foo.bar 列表索引查找。示例:foo[bar] 但您可以制作一个过滤器,让您传入参数:

写一篇:

我使用.get,因此如果缺少键,它将返回none。如果执行dictionary[key],则会引发一个KeyError

用法:

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

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

{{ mydict|get_item:item.NAME }}

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

我也遇到过类似的情况。然而,我使用了不同的解决方案

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

在我的模型中:-

{% for key, value in mydict.items %}
    {{ value }}
{% endfor %}
在我的模板中:-

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

对我来说,在我的应用程序中创建一个名为template_filters.py的python文件,并使用以下内容完成了这项工作

The state is: {{ item.state_ }}
用法就像库莱布伦所说的:

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

register = Library()


@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)
环境:django 2.1.7

视图:

{{ mydict|get_item:item.NAME }}
模板:

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>

环境:Django 2.2

示例代码: 我将此代码放在名为portfoliomgr的项目文件夹中名为template_filters.py的文件中

无论您将筛选代码放在何处,都要确保在该文件夹中有_init__u;.py

将该文件添加到projectfolder/settings.py文件模板部分的库部分。对我来说,它是portfoliomgr/settings.py

在html代码中加载库



    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',
                }
            },
        },
    ]


,供将来发现此功能的用户使用。为什么默认情况下不内置此功能-我想@Jeff在Jinja2中的意思是{{mydict[key]}过滤器是在views.py、一些额外的filters.py还是什么文件中?他没有像你所说的那样要求枚举dict-他要求得到给定变量键的dict值。您的建议没有提供解决方案。这是一个效率非常低的解决方案,因为您可以枚举dict的项,然后与列表中的键进行匹配。请注意,如果您尝试访问的词典中包含另一个词典,则此方法无效。如果您的值是dict,您可以包含另一个for循环来处理它们的键和值,但可能由于复杂性,您需要使用@culebron的答案中描述的自定义过滤器。为什么register=Library?它的作用是什么?如果你想让所有模板都知道你的新过滤器,那么你必须在django.template.base.Library类下注册它。通过register=Library,我们实例化该类,并在其中使用过滤器函数注释器来满足我们的需要。模板代码{dict_obj.obj.obj_name}在本例中相当于Python代码dict_obj[obj][obj_name],然而,问题是dict_obj[obj][obj_name]的等价物。如何使用答案,在模板内部?我仍然会使用return value.getarg,因为如果该键不存在,则不会引发KeyError异常。是否可以将返回的值{{mydict | lookup:item.name}}分配给variable@Jibin我不知道你的问题是什么意思。也许我的代码令人困惑;从那时起,我已经更正了它并添加了评论。
{% 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>
# 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 }}


    from django.template.defaulttags import register

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



    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',
                }
            },
        },
    ]


{% load template_filters %}