Python 为什么Django模板语言不允许类似于[0][1]的东西?

Python 为什么Django模板语言不允许类似于[0][1]的东西?,python,django,Python,Django,当我试图以Django模板格式访问列表中的元组时,我发现我无法使用[0][1]来访问它,而只能使用a.0.1 假设a是 a = [ ( 'a', 'apple' ), ( 'b', 'bee' ), ] 为什么Django模板语言不支持[0][1]?在普通的Python编程中,a.0.1会给您一个语法错误。我之所以说django模板语言不使用XYZ方式访问上下文数据,是因为通常在这一点上,您在模板方面做的太多,而不是在呈现上下文数据的视图中 他们的模板引擎的设计决策似乎比其

当我试图以Django模板格式访问列表中的元组时,我发现我无法使用[0][1]来访问它,而只能使用a.0.1

假设a是

a = [
    ( 'a', 'apple' ),
    ( 'b', 'bee'   ),
]

为什么Django模板语言不支持[0][1]?在普通的Python编程中,a.0.1会给您一个语法错误。

我之所以说django模板语言不使用XYZ方式访问上下文数据,是因为通常在这一点上,您在模板方面做的太多,而不是在呈现上下文数据的视图中

他们的模板引擎的设计决策似乎比其他一些模板引擎轻,这些模板引擎可以让您更方便地直接访问数据。但理想情况下,您应该在传递上下文之前格式化它

您还可以创建自己的模板过滤器,以便对数据进行更多自定义处理


针对您的问题,使用点表示法访问子成员是django模板尝试多种方法解析成员的方法。它按一定顺序尝试字典键、属性等。你只要用点符号就可以了

我之所以说django模板语言不使用XYZ方式访问上下文数据,是因为通常在这一点上,相对于呈现上下文数据的视图,您在模板方面做的太多了

他们的模板引擎的设计决策似乎比其他一些模板引擎轻,这些模板引擎可以让您更方便地直接访问数据。但理想情况下,您应该在传递上下文之前格式化它

您还可以创建自己的模板过滤器,以便对数据进行更多自定义处理

针对您的问题,使用点表示法访问子成员是django模板尝试多种方法解析成员的方法。它按一定顺序尝试字典键、属性等。你只要用点符号就可以了

上的Django文档很好地解释了这一点:

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

查字典。示例:foo[bar] 属性查找。示例:foo.bar 列表索引查找。示例:foo[bar] 模板系统使用第一种有效的查找类型。这是短路逻辑。以下是几个例子:

>>> from django.template import Context, Template
>>> t = Template("My name is {{ person.first_name }}.")
>>> d = {"person": {"first_name": "Joe", "last_name": "Johnson"}}
>>> t.render(Context(d))
"My name is Joe."

>>> class PersonClass: pass
>>> p = PersonClass()
>>> p.first_name = "Ron"
>>> p.last_name = "Nasty"
>>> t.render(Context({"person": p}))
"My name is Ron."

>>> t = Template("The first stooge in the list is {{ stooges.0 }}.")
>>> c = Context({"stooges": ["Larry", "Curly", "Moe"]})
>>> t.render(c)
"The first stooge in the list is Larry."
似乎是负责这一点的功能,并且没有太大变化

Django文档对此进行了很好的解释:

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

查字典。示例:foo[bar] 属性查找。示例:foo.bar 列表索引查找。示例:foo[bar] 模板系统使用第一种有效的查找类型。这是短路逻辑。以下是几个例子:

>>> from django.template import Context, Template
>>> t = Template("My name is {{ person.first_name }}.")
>>> d = {"person": {"first_name": "Joe", "last_name": "Johnson"}}
>>> t.render(Context(d))
"My name is Joe."

>>> class PersonClass: pass
>>> p = PersonClass()
>>> p.first_name = "Ron"
>>> p.last_name = "Nasty"
>>> t.render(Context({"person": p}))
"My name is Ron."

>>> t = Template("The first stooge in the list is {{ stooges.0 }}.")
>>> c = Context({"stooges": ["Larry", "Curly", "Moe"]})
>>> t.render(c)
"The first stooge in the list is Larry."

似乎是负责此操作的功能,并且没有太大变化

有关此操作的信息,请参见:

本章的开头应该解释为什么它是这样工作的: 在上一章中,您可能已经注意到我们在示例视图中返回文本的方式有些特殊。也就是说,HTML是直接在Python代码中硬编码的,如下所示:

虽然这种技术对于解释视图如何工作很方便,但直接在视图中硬编码HTML并不是一个好主意。原因如下:

对页面设计的任何更改都需要对Python代码进行更改。站点的设计往往比底层Python代码更频繁地更改,因此,如果设计可以更改而不需要修改Python代码,那就更方便了。 编写Python代码和设计HTML是两门不同的学科,大多数专业的Web开发环境将这些职责分散在不同的人员甚至部门之间。设计师和HTML/CSS程序员不应该被要求编辑Python代码来完成他们的工作。 如果程序员可以处理Python代码,而设计师可以同时处理模板,而不是一个人等待另一个人完成对包含Python和HTML的单个文件的编辑,那么效率最高。 由于这些原因,将页面设计与Python代码本身分离会更干净、更易于维护。我们可以使用Django的模板系统来实现这一点,我们将在本章中讨论

点查找可概括如下:当模板系统遇到变量名中的点时,它会按以下顺序尝试以下查找:

字典查找,例如foo[bar] 属性查找,例如foo.bar 1 方法调用,例如foo.bar 列表索引查找,例如。, 傅[2] 系统使用第一种有效的查找类型。这是短路逻辑


您可以在以下网站中找到有关这方面的信息:

本章的开头应该解释为什么它是这样工作的: 在上一章中,您可能已经注意到我们在示例视图中返回文本的方式有些特殊。也就是说,HTML是直接在Python代码中硬编码的,如下所示:

虽然这种技术对于解释视图如何工作很方便,但直接在视图中硬编码HTML并不是一个好主意。原因如下:

对页面设计的任何更改都需要对Python代码进行更改。站点的设计往往比底层Python代码更频繁地更改,因此,如果设计可以更改而不需要修改Python代码,那就更方便了。 编写Python代码和设计HTML是两门不同的学科,大多数专业的Web开发环境将这些职责分散在不同的人员甚至部门之间。设计师和HTML/CSS程序员不应该被要求编辑Python代码来完成他们的工作。 如果程序员可以处理Python代码,而设计师可以同时处理模板,而不是一个人等待另一个人完成对包含Python和HTML的单个文件的编辑,那么效率最高。 由于这些原因,将页面设计与Python代码本身分离会更干净、更易于维护。我们可以使用Django的模板系统来实现这一点,我们将在本章中讨论

点查找可概括如下:当模板系统遇到变量名中的点时,它会按以下顺序尝试以下查找:

字典查找,例如foo[bar] 属性查找,例如foo.bar 1 方法调用,例如foo.bar 列表索引查找,例如foo[2] 系统使用第一种有效的查找类型。这是短路逻辑


与渲染它的视图相比,您在模板方面做得太多了。这是一个完美的总结。谢谢!我喜欢你的解释和dbr的例子。我更像是一个榜样,哈哈。我仍然很感激你的回答!与渲染它的视图相比,您在模板方面做得太多了。这是一个完美的总结。谢谢!我喜欢你的解释和dbr的例子。我更像是一个榜样,哈哈。我仍然很感激你的回答!