【问题标题】:Django, how to parse a single form field (HTML) without a for loopDjango,如何在没有 for 循环的情况下解析单个表单字段(HTML)
【发布时间】:2011-08-08 13:26:09
【问题描述】:

我想单独解析我的 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 表单元素。

有人知道怎么做吗?

【问题讨论】:

    标签: django forms modelform


    【解决方案1】:

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

    {{ form.status }}
    

    几句话:

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

    >>> 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_fields 而不是fields?好吧,这是另一个故事,这与来自 ModelForm 中的模型的字段如何与表单类中声明的字段分离有关。

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

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

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

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

    【讨论】:

    • 谢谢你!我认为由于 Django 文档的每个循环的示例,我必须使用 form.fields 对象..
    • 添加了一些额外的词,我希望对你有所了解:)
    猜你喜欢
    • 2018-03-21
    • 2011-03-29
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多