【问题标题】:Why can't use numbers to reference dictionary in Django为什么不能使用数字在 Django 中引用字典
【发布时间】:2018-12-20 04:56:13
【问题描述】:

我正在尝试使用使用循环创建的字典来呈现页面,并且在尝试在模板(.html)中引用它时,它正在打印数字,尽管该键的值

view.py

dicti={}
key = range(len(OPTIONS)) # a tuple
for i in key:        
    dicti[i] = polls_model.objects.filter(options=i).count()
dicti.update({'len_of_key' : key})
print(dicti)
return render(request,'polls/thanks.html', dicti)

这打印 {0:1, 1:1, 2:0, 3:0, 'len_of_key': range(0, 4)}

谢谢.html

<div class="row">
    {% for i in len_of_key %}
        <div class="column">
            <div class="card">
                <h3>
                    {{ i }}
                </h3>
            </div>
        </div>            
    {% endfor %}
</div>

当它运行时,我的输出中最终有 1,2,3,4。

请提供一点帮助

【问题讨论】:

  • 你想在你的模板中有键或值被渲染吗?
  • 我希望渲染模板中的值
  • 从逻辑上讲,0,1,2,3, len_of_key 是键,1,1,0,0,range(0,4) 是值,所以我试图通过他们的键,所以在模板中使用“i”。但它只打印 0,1,2,3

标签: python django loops templates for-loop


【解决方案1】:

尝试做:

return render(request,'polls/thanks.html', {'dicti': dicti})

{% for key, value in dicti.items %}
    <div class="column">
        <div class="card">
            <h3>
                {{ value }}
            </h3>
        </div>
    </div>            
{% endfor %}

【讨论】:

  • 由于某种原因这不起作用,甚至在 for 循环中也没有解释
  • 这必须工作。您只是没有更改第一行中所示的render 语句。在您的代码中,没有上下文变量 dicti
【解决方案2】:

我有点难以理解你的问题。从我得到的是你想返回一个选项出现的次数。

首先,range(len(OPTIONS)) 没有意义 你会更好

for i, key in enumerate(OPTIONS):
    dicti[i] = polls_model.objects.filter(options=i).count()

但我怀疑您是否真的需要根据您的价值指数来过滤民意调查。所以你可能想把.filter(options=i)改成.filter(options=key)

接下来,您从模型中返回的值,您不应该在字典中为它们创建单独的键。如果顺序很重要,绝对不会。

最好创建一个存储结果的键,这也意味着枚举已过时:

dicti = {}
dicti['polls'] = []

for key in OPTIONS:
    dict['polls'].append(polls_model.objects.filter(options=key).count())

return render(request, 'polls/thanks.html', dicti)

最后在模板中,您的代码看起来还不错,但您应该循环遍历我们刚刚创建的键:

<div class="row">
    {% for poll in polls %}
        <div class="column">
            <div class="card">
                <h3>
                    {{ poll }}
                </h3>
            </div>
        </div>            
    {% endfor %}
</div>

这应该会在模板中返回您的投票计数。如果您需要在某处显示民意调查的长度,您可以改用{{ polls|length }}

【讨论】:

  • 当我在 dict['polls'].append(polls_model.objects.filter(options=key).count()) 中将 key 替换为 'i' 时,此解决方案有效
  • @Pradeep 我没有在答案中提到它,但是如果您打算使用大量数据运行它,您应该使用Q objects 以避免过多地查询数据库
  • 感谢@ghyllebert,我将在运行复杂的数据库操作时使用它,但这个演示应用程序以这个简单的查询结束。
【解决方案3】:

在 Django 模板中像这样迭代你的字典。

 <div class="row">
        {% for i, j in dicti.items %}
            <div class="column">
                <div class="card">
                    <h3>
                        {{ j }}
                    </h3>
                </div>
            </div>            
        {% endfor %}
    </div>

【讨论】:

  • 由于某种原因这不起作用,甚至在 for 循环中也没有解释
猜你喜欢
  • 2010-11-22
  • 2018-06-13
  • 2012-02-04
  • 1970-01-01
  • 2020-03-27
  • 2011-06-09
  • 2022-01-02
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多