首页 > 解决方案 > django 模板中的“form.as_p”从何而来?

问题描述

我有一个通用视图和一个表单模板。
我的看法是:

class BlogCreateView(CreateView):
    model = Post
    template_name = "post_new.html"
    fields = "__all__"

我的表单模板是:

{% extends "base.html" %}
{% block content %}
    <h1>New Post</h1>
    <form action="" method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Save" />
    </form>
{% endblock content %}

现在我的问题是关于form.as_p或特别是form
那个是从哪里来的?

请帮帮我。多谢

标签: pythondjangoformsdjango-templates

解决方案


.as_p()[Django-doc]Form. 它生成一个SafeText对象 [Django-doc],其中包含要包含在模板中的 HTML 代码。

它很重要的事实SafeText,因为 Django 渲染引擎否则会“转义”它:不使用SafeText,它将替换<&lt;; >with&gt;等。当然,除非您自己将其包装在一个SafeText对象中,例如通过|safe模板过滤器 [Django-doc]

例如,我们可以在文档中定义一个表单:

class OptionalPersonForm(forms.Form):
    first_name = forms.CharField()
    last_name = forms.CharField()
    nick_name = forms.CharField(required=False)

如果我们然后构造一个表单对象,我们可以调用该.as_p()方法:

>>> OptionalPersonForm().as_p()
'<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" required id="id_first_name"></p>\n<p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" required id="id_last_name"></p>\n<p><label for="id_nick_name">Nick name:</label> <input type="text" name="nick_name" id="id_nick_name"></p>'
>>> type(OptionalPersonForm().as_p())
<class 'django.utils.safestring.SafeText'>

Django 表单具有三种流行的呈现方法:.as_p.as_table()[Django-doc].as_ul()[Django-doc]。不同之处在于它们呈现 HTML 的方式略有不同:作为段落、表格或无序列的 HTML 列表。


推荐阅读