试图了解Django在视图和模板之间的通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了试图了解Django在视图和模板之间的通信相关的知识,希望对你有一定的参考价值。

(编辑)我来自web2py背景,发现Django是一个比web2py更复杂的学习和使用框架。

在第一个答案之后,我已经调整了我的问题的描述。

在我看来,我有:

def team(request):
hr = dict(name="Some Name", photo="/static/images/HR.jpg", url="http://some.website.com/?page_id=3602")
js = dict(name="Some Name2", photo="/static/images/JS.jpg", url="http://some.website.com/?page_id=3608")
context = {team:[hr,js]}
return render(request, "wos_2017_2/team.html", context)

在我的模板中

<ul>
   {% for person in context.team %}
   <li> {{ person.name }} {{ person.photo }} {{ person.url }} </li>
   {% endfor %}
</ul>

绝对没有输出。

这适用于普通的python:

hr = dict(name="Some Name", photo="/static/images/HR.jpg", url="http://some.website.com/?page_id=3602")
js = dict(name="Some Name2", photo="/static/images/JS.jpg", url="http://some.website.com/?page_id=3608")
context = dict(team = [hr,js])
for i in context['team']:
    print(i['name'], i['photo'], i['url'])

随着输出

Some Name /static/images/HR.jpg http://some.website.com/?page_id=3602
Some Name2 /static/images/JS.jpg http://some.website.com/?page_id=3608

为什么我没有在Django中获得任何结果?

答案

你的第一个例子是正确的。可悲的是,你的第一行代码中有一个小错字:

hr = dict(name="Some Name, ...),

该行以逗号,结尾。现在hr成为一个单一元素的tuple:dict。没有逗号这可行:

{{ team.0.name }}
{{ team.1.name }}

根据您的更新答案,您需要在模板中将context.team更改为team

{% for person in team %}

上下文字典在模板中“解压缩”。

另一答案

我无法发表评论所以我不得不发表回答。

只有不可变数据类型可以用作键,即不能使用列表或字典如果使用可变数据类型作为键,则会收到错误消息。键可以正常使用。

我可以告诉你的问题是你的视图代码:

这个

context = {team:[hr,js]}

应该这样:

context = {"team":[hr,js]}

要么

context = dict(team=[hr,js])
另一答案
<ul>
                    {% for person in team %}
                    <li> {{ person.name }} {{ person.photo }} {{ person.url }} </li>
                    {% endfor %}
 </ul>

是读取模板中字典的正确方法。

以上是关于试图了解Django在视图和模板之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

Django之框架,视图,模板

JavaScript 片段在 Django 模板中不起作用

如何在Django视图中使用for循环返回每次迭代[关闭]

Django将Python对象从视图传递到模板中的Javascript脚本

从基于类的视图模板中的 django 打印变量

邂逅Django——视图