0

在 Python 中,如果你的 Django 表单form中有一个名为 的字段foo,则不能使用属性访问语法form.foo来访问该字段;相反,您必须使用form.fields['foo'].

但是在模板中,您可以(通常会)使用{{ form.foo }}适用于模板中任何对象的正常属性访问语法来呈现字段。

{{ form.foo }}当 Pythonform.foo不工作时,模板为什么/如何工作?Django在渲染模板时是否有点特殊处理?还是我只是误解了一些简单的事情?

编辑:我知道 Django 的模板语言不是 Python,与 Python 有很多不同。我只是好奇为什么{{ form.foo }}语法有效和/或在表单的情况下它是如何实现的。毕竟,通常模板{{ object.attribute }}语法确实类似于 Pythonobject.attribute语法,但在表单的情况下,它似乎被视为一种特殊情况。

4

2 回答 2

4

正如 Kerrek SB 所提到的,Django 的模板语言不是 Python,即使它有时看起来很像。{{ object.attribute }} 看起来确实{{ a.b }}模仿了 Python 的属性查找,但它只是模板语言中的一个特例。

当您在模板中使用时,解释器将首先在当前上下文中{{ a.b }}查找。a一旦有了它,它将尝试以下方法来解决a.b

  • a["b"]
  • a.b
  • a.b()(在 whereb是 的方法的情况下a
  • a[b](在 是数字的情况下b

对于表格,具体来说,a["b"]是使用什么。您可以将字段"foo"称为form.fields["foo"] form["foo"]不过,那一点魔法来自表单类,而不是模板语言。

于 2012-09-03T05:48:44.643 回答
1

您所指的模板不是 Python——它是由 Python 程序解析的一种单独的、专用的标记语言但它本身不是用 Python 编写的,也不是直接执行的。模板语言提供了一种方便的语法来访问表单字段,但这与 Python 本身的工作方式无关。

于 2012-09-03T05:02:27.723 回答