Django,如何在没有for循环的情况下解析单个表单字段(HTML)

Sve*_*len 2 forms django modelform

我想分别解析我的Modelform的字段而不是for循环.我想要一些字段来解析该元素的Django HTML.我有这个:

<form action="#" method="POST" name="notifictaionForm">
    <ul>  
        <li><label>{{ form.fields.title.label }}</label> <span>{{ notification.title }}</span></li>
        <li><label>{{ form.fields.create_date.label }}</label> <span>{{ notification.create_date }}</span></li>
        <li><label>{{ form.fields.description.label }}</label> <span>{{ notification.description }}</span></li>
        <li><label>{{ form.fields.status.label }}</label> <span>{{ form.fields.status.??? }}</span></li>
    </ul>
</form>
Run Code Online (Sandbox Code Playgroud)

所以我可以解析字段的名称而不是HTML元素,我想在???模板代码中解析Django HTML表单元素.

有人知道怎么做吗?

Ski*_*Ski 9

如果我很了解你,你想要django自动生成的html status字段吗?那很简单:

{{ form.status }}
Run Code Online (Sandbox Code Playgroud)

几句额外的话:

Form是类似dict的对象,可以像这样访问字段:

>>> form['field_name']
Run Code Online (Sandbox Code Playgroud)

声明的字段被存储在form.fields,一个SortedDict对象.因此,您可以使用此变量来访问字段,但建议的方法始终是最短的方式.

如果您不熟悉Python,您可能想知道如何将字段声明为属性,但是您无法从python代码中访问它们,如下所示:

>>> form.field_name
AttributeError: 'Form' object has no attribute 'field_name'
Run Code Online (Sandbox Code Playgroud)

好吧,因为python中的类不是静态的,元类可以用于构建类定义之外的所有类型的新东西.Django利用它来创建一个友好的API.基本上它是这样的:

  1. Python解释器解析您的Form类.
  2. 解释器查找__metaclass__继承自的属性django.forms.Form并将其设置为:DeclarativeFieldsMetaclass.
  3. 元类重组你的课程.删除.base_fields属性并创建属性.
  4. 为什么base_fieldsfields呢?嗯,这是另一个故事,这与如何将来自模型中的模型的字段与表单类中声明的字段分开.

但是,不要将元类与class Meta有时用于为表单或模型提供附加配置选项的元类混淆.

现在回到模板.您无法form.field_name从python代码访问,为什么在模板中可以实现?如django文档中所述,当模板系统遇到点时,它会按以下顺序尝试以下查找:

  • 字典查找
  • 属性查找
  • 方法调用
  • 列表索引查找

这意味着模板系统在遇到时会首先尝试返回:{{ form.field_name }}是:form['field_name'].