我想单独解析模型表单的字段,而不是在 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 表单元素。
有人知道怎么做吗?
最佳答案
如果我明白你的意思,你想要 django 自动生成 status
字段的 html 吗?那么就很简单了:
{{ form.status }}
<小时/>
几句话:
表单是类似字典的对象,可以像这样访问字段:
>>> form['field_name']
声明的字段存储在form.fields
中,a SortedDict目的。因此,您可以使用此变量来访问字段,但推荐的方式始终是最短的方式。
如果您是 Python 新手,您可能想知道如何将字段声明为属性,但无法从 Python 代码中访问它们,如下所示:
>>> form.field_name
AttributeError: 'Form' object has no attribute 'field_name'
因为Python中的类不是静态的,所以元类可以用来从类定义中构建各种新的东西。 Django 利用它来创建一个友好的 API。基本上是这样的:
- Python 解释器解析您的 Form 类。
- 解释器找到从
django.forms.Form
继承的__metaclass__
属性,并将其设置为:DeclarativeFieldsMetaclass 。 - 元类重组您的类。属性已删除,
.base_fields
属性已创建。 - 为什么
base_fields
而不是fields
?好吧,这是另一个故事了,这与来自 ModelForm 中模型的字段如何与表单类中声明的字段分离有关。
但不要将元类与 class Meta
混淆,后者有时用于为表单或模型提供其他配置选项。
现在返回模板。您无法从Python代码访问form.field_name
,为什么可以在模板中访问?如 django documentation 中所述,当模板系统遇到点时,它会按以下顺序尝试以下查找:
- 字典查找
- 属性查找
- 方法调用
- 列表索引查找
这意味着模板系统在遇到:{{ form.field_name }}
时尝试返回的第一件事是:form['field_name']
。
关于Django,如何在没有 for 循环的情况下解析单个表单字段(HTML),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5714816/