在python字典上访问值时遇到麻烦,这些值也是Django模板中的字典

时间:2019-07-17 17:33:15

标签: python django dictionary

传递给模板的字典不会产生任何值。

我尝试了各种访问字典值的方法,甚至自定义过滤器,也没有运气。

view.py

def home_view(request, location):
    cards = Site.objects.get(sites=location.upper()
                             ).site_cards.all().values('cards')
    vlans = json.load(open('allvendors/static/json/vlan.json'))
    vlans_location = vlans[location]

    home = {
        "site": location,
        "cards": cards,
        "vlans": vlans_location,
    }
    return render(request, 'allvendors/home.html', {"home": home})

allvendors_filters.py

from django import template

register = template.Library()

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

卡片

<QuerySet [{'cards': 'A'}, {'cards': 'B'}, {'cards': 'C'}, {'cards': 'D'}]>

vlans_location

{
   'A':{
      'vlan':'101'
   },
   'B':{
      'vlan':'102'
   },
   'C':{
      'vlan':'103'
   },
   'D':{
      'vlan':'104'
   }
}

home.html

{% load allvendors_filters %}
{% for card in home.cards %}
        <div class="card mb-4 box-shadow shadow">
            <div class="card-header">
                <h4 id="whatfor" class="my-0 font-weight-normal">{{ card|title }}</h4>
            </div>
            <div class="card-body">
                <h1 class="card-title pricing-card-title">Vlan:
                    <small class="text-muted">
                        <a href="#" target="_blank">
                            {{ home.vlans|lookup:card.cards }}
                        </a>
                    </small>
                </h1>
                <a class="text-decoration-none" href="{{ card|lower }}/">
                    <button id="seedata" type="button" class="btn btn-lg btn-block btn-outline-primary">See
                        Database</button>
                </a>
            </div>
        </div>
        {% endfor %}

问题是{{card}}本身有效,循环为每个卡1到3创建了一个div,但是{{card.vlan}}不会输出任何内容。

我觉得自己访问错误,但是我无法弄清楚原因或方式。

欢迎使用任何指针。

编辑

尝试重新考虑一下,使用了一个自定义过滤器:{{home.vlans | lookup:card.cards}}为我提供了一个对应于card的值的字典,并且字典本身是用html编写的:

 {'vlan': '101'} written in Card A
 {'vlan': '102'} written in Card B
...and so on

但是如果尝试访问VLAN,则失败,并显示{{home.vlans | lookup:card.cards.vlan}}->无法在'A'中查找键[vlan]

解决方案

在下面的选定标记答案中。

谢谢

2 个答案:

答案 0 :(得分:1)

这里是一个快速答案,我认为您的for card in home.cards正在迭代dict键,如果您也想获取该键,请尝试使用for card in home.cards.valuesfor card_key, card_dict in home.cards.items

答案 1 :(得分:0)

数据:

home_dict = [{'A':'v1','B':'v2'},{'C':'v3','D':'v4'}]

Jinja迭代:

{% for dict in home_dict %}
   {% for key, value in dict.items %}
      <h1>Key: {{key}}</h1>
      <h2>Value: {{value}}</h2>
   {% endfor %}
{% endfor %}

注意: 确保您拥有字典项目列表。