django 模板中的“form.as_p”从何而来?

Posted

技术标签:

【中文标题】django 模板中的“form.as_p”从何而来?【英文标题】:where `form.as_p`in django templates come from? 【发布时间】:2019-12-18 00:55:37 【问题描述】:

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

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这是从哪里来的?

请帮帮我。非常感谢

【问题讨论】:

来自render() 调用:render(request, 'foo.html', 'form': form) 【参考方案1】:

.as_p() [Django-doc] 是Form 上的一个方法。它会生成一个SafeText object [Django-doc],其中包含要包含在模板中的 HTML 代码。

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

例如我们可以定义一个表单like in the documentation:

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 列表。

【讨论】:

以上是关于django 模板中的“form.as_p”从何而来?的主要内容,如果未能解决你的问题,请参考以下文章

Django模板过滤器 - 一行

Django 的 Field 的“default”和 test 的“client”参数从何而来?

“page” GET 参数从何而来?

Django 中的 % % 和

spyder中的opencv从何而来

覆盖 UITableViewController 中的 setEdit:调用从何而来?