当我不知道我将收到的结构时,如何循环遍历 Django 中的嵌套上下文字典

How do I loop through a nested context dictionary in Django when I have no idea the structure I will recieve

我有一本字典正在传递给一个看起来像这样的模板:

{'leasee': {'respond': {'hour': True, 'day': True}, 'contact': {'phone': True, 'facebook': True, 'email': True, 'other': True, 'text': True}, 'licence': '987654321', 'help': {'beautySupplyProvider': True, 'photographer': True}, 'phoneNumber': '12345678910', 'name': 'Chris', 'certifications': {'yes': True, 'long': 'All of them'}, 'profession': {'massageTherapist': True, 'nailTechnician': True, 'barber': True}, 'amenities': {'receptionist': True, 'retailDisplayShelfSpace': True, 'long': 'some words', 'other': True, 'highTrafic': True}, 'email': 'chris@internet.com', 'circleData': '(45.5144493,-122.6710338) 400', 'compare': {'uniqueVsChic': '1', 'teamVsSolo': '1', 'familyVsUpscale': '8'}}}

我需要它是一个如下所示的列表:

Key:
    Value
Key:
    Value
    Value
    Value

等等。

我能得到的最接近的是

{% for key, value in leasee.items %}
    <p> {{key}} </p>
    <ul>
    {% for k2, v2 in value.items %}
        <li> {{ k2 }} </li>
        {% for k3, v3 in v2.items %}
            <li>{{ k3 }}:{{ v3 }}</li>
            {% endfor %}
{% endfor %}
    </ul>

{% endfor %}

但只有一个值而不是其他字典作为值的键不会显示。我怎样才能使这项工作?

我只想在这里添加我的问题的答案,以防有人遇到这个问题。感谢 Animesh Sharma!

我必须创建一个模板标记来确定我正在循环的数据类型。看起来像这样。

from django import template

register = template.Library()

@register.filter
def data_type(value):
    if type(value) is dict:
        return 'dict'

很有魅力。

我建议您为此实施 custom template tag

在此标签内,您可以根据数据的结构正确呈现数据。

您需要定义 returns 数据类型的自定义模板标签。

from django import template

register = template.Library()

@register.filter
def data_type(value):
    return type(value)

然后像这样在你的模板中使用它:

{% for key, value in leasee.items %}
    <p> {{key}} </p>
    <ul>
    {%if value|data_type == 'dict' %}
    {% for k2, v2 in value.items %}
        <li> {{ k2 }} </li>
        {%if v2|data_type == 'dict'%}
        {% for k3, v3 in v2.items %}
            <li>{{ k3 }}:{{ v3 }}</li>
            {% endfor %}
    {%else%}
    <li>{{v2}}</li>
    {%endif%}

{% endfor %}
{%else%}
<li>{{value}}</li>
{%endif%}
    </ul>

{% endfor %}