2

我想单独解析我的 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>

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

有人知道该怎么做吗?

4

1 回答 1

9

如果我很好理解你,你想要 django 自动生成的 htmlstatus字段吗?然后就很简单了:

{{ form.status }}

多说几句:

表单是类字典对象,可以像这样访问字段:

>>> form['field_name']

声明的字段存储在form.fields一个SortedDict对象中。所以你可以使用这个变量来访问字段,但是推荐的方式总是最短的方式。

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

>>> form.field_name
AttributeError: 'Form' object has no attribute 'field_name'

嗯,这是因为 python 中的类不是静态的,元类可以用来从类定义中构建各种新事物。Django 利用它来创建一个友好的 API。基本上它是这样的:

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

但不要将元类与class Meta有时用于为表单或模型提供额外配置选项的元类混淆。

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

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

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

于 2011-04-19T11:31:14.133 回答