<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>文本编辑器 &#8211; 李辉 / Grey Li</title>
	<atom:link href="https://greyli.com/tag/%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%99%A8/feed/" rel="self" type="application/rss+xml" />
	<link>https://greyli.com</link>
	<description>一个编程和写作爱好者的在线记事本</description>
	<lastBuildDate>Sun, 23 Nov 2025 15:01:33 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.26</generator>

<image>
	<url>https://greyli.com/wp-content/uploads/2025/03/avatar-500-compressed-144x144.jpg</url>
	<title>文本编辑器 &#8211; 李辉 / Grey Li</title>
	<link>https://greyli.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>为你的Flask项目添加富文本编辑器</title>
		<link>https://greyli.com/flask-project-for-you-to-add-the-rich-text-editor/</link>
		<comments>https://greyli.com/flask-project-for-you-to-add-the-rich-text-editor/#respond</comments>
		<pubDate>Tue, 22 Nov 2016 06:13:26 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[文本编辑器]]></category>

		<guid isPermaLink="false">http://withlihui.com/?p=1248</guid>
		<description><![CDATA[# 更新（2017/9/30） 可以考虑使用扩展Flask-CKEditor，详情见文章《Flask-CKEd [&#8230;]]]></description>
				<content:encoded><![CDATA[<h4># 更新（2017/9/30）</h4>
<p>可以考虑使用扩展<a href="https://github.com/greyli/flask-ckeditor" target="_blank">Flask-CKEditor</a>，详情见文章<a href="http://greyli.com/flask-ckeditor-integrate-rich-text-editor/" target="_blank">《Flask-CKEditor——为Flask项目集成富文本编辑器》</a>。</p>
<h2><b>什么是富文本编辑器？</b></h2>
<p>如果你已经知道什么是富文本编辑器，可以跳到第三段。</p>
<p>简单来说，富文本编辑器就是网页版的Office Word，只不过Word保存.docx格式的文件，它保存HTML代码。之所以叫<b>富文本编辑器</b>（Rich Text Editor），是因为它提供了很多格式工具，比如添加标题，加粗文本等等，所以它又叫做<b>所见即所得</b>编辑器（WYSIWYG &#8211; What You See Is What You Get）。与富文本相对的不是穷文本，而是<b>纯文本</b>（Plain text）。比如你在HTML里用input标签生成的输入框，保存的数据就是纯文本。</p>
<div id="attachment_1250" style="width: 785px" class="wp-caption aligncenter"><a href="http://greyli.com/wp-content/uploads/2016/11/d.png" rel="attachment wp-att-1250"><img class="size-full wp-image-1250" src="http://greyli.com/wp-content/uploads/2016/11/d.png" alt="富文本编辑器ckeditor" width="775" height="770" srcset="https://greyli.com/wp-content/uploads/2016/11/d.png 775w, https://greyli.com/wp-content/uploads/2016/11/d-150x150.png 150w, https://greyli.com/wp-content/uploads/2016/11/d-300x298.png 300w, https://greyli.com/wp-content/uploads/2016/11/d-144x144.png 144w, https://greyli.com/wp-content/uploads/2016/11/d-624x620.png 624w" sizes="(max-width: 775px) 100vw, 775px" /></a><p class="wp-caption-text">富文本编辑器ckeditor</p></div>
<p>在《Flask Web开发》里，作者为博客添加了一个Markdown编辑器，但是事实上，Markdown并没有得到广泛的支持。基于易用性的考虑，你可能想为你的项目添加一个富文本编辑器。</p>
<h2><b>二选一</b></h2>
<p>对于初学者来说，网上的学习资源太多了，太多的选择首先就是一个问题。你要知道自己需要什么，在不清楚自己需求的情况下，就选一个最常用的。选工具也是这样。基于这些考虑，同类事务，我只推荐一到两个我认为最好的或是最易用的。</p>
<blockquote>
<ul>
<li>不要在入门上花费太多时间；先求深度后求广度。</li>
<li>从需求出发选择工具。</li>
</ul>
</blockquote>
<p><b>第一个：CKEditor</b></p>
<p><a class="" href="http://ckeditor.com/">http://ckeditor.com/</a></p>
<p><b>第二个：TinyMCE</b></p>
<p><a class="" href="https://www.tinymce.com/">https://www.tinymce.com/</a></p>
<p>这两个编辑器都是开源项目，而且都有丰富的文档。你可以到各自的网站体验一下。</p>
<p>另外，附上这两个编辑器的slogan，你可以做个考量：</p>
<ul>
<li>CKEditor：The Best Web Text Editor for Everyone</li>
<li>TinyMCE：The Most Advanced WYSIWYG HTML Editor</li>
</ul>
<p>选好了吗？那就开始配置吧！二者的配置都相当简单，加上在<a href="https://zhuanlan.zhihu.com/p/23605834?refer=flask" data-editable="true" data-title="Flask表单：自定义表单样式">Flask表单：自定义表单样式</a>里的内容，我们可以很容易的配置成功。</p>
<h2><b>配置CKEditor</b></h2>
<h4> </h4>
<p><b>使用CDN</b></p>
<p>最方便的方式是使用CDN。</p>
<p>首先在表单类里使用定义一个TextAreaField字段（从wtforms导入）：</p>
<pre lang="python">...
body = TextAreaField(u'正文', validators=[DataRequired(u'内容不能为空！')])
...</pre>
<p>然后在要添加编辑器的模板头部添加head块，加入CDN链接：</p>
<pre lang="django">{% block head %}
{{ super() }}
&lt;script src="//cdn.ckeditor.com/4.5.11/standard/ckeditor.js"&gt;&lt;/script&gt;
{% endblock %}</pre>
<blockquote>
<p>如果你使用Flask-Bootstrap，加载其他的JavaScript或是CSS资源时，要使用Jinja2提供的super()函数向父块添加内容，而不是替换父块。更多内容见<a class="" href="http://flask-bootstrap-zh.readthedocs.io/zh/latest/faq.html?highlight=super#jacascript" data-title="相关文档" data-editable="true">相关文档</a>。</p>
</blockquote>
<p>最后在渲染表单时添加一个ckeditor类到这个字段就可以了：</p>
<pre lang="django">{{ form.body(class="ckeditor") }}</pre>
<p>&nbsp;</p>
<p><b>在本地加载</b></p>
<p>下载页面：<a class="" href="http://ckeditor.com/download">http://ckeditor.com/download</a></p>
<p>CKeditor提供了三个版本可供选择：基础、标准和完全，还提供了自定义组件功能。</p>
<p>下载后解压放到你项目的static文件夹，然后在模板引入文件：</p>
<pre lang="text">{% block head %}
{{ super() }}
&lt;script src="{{ url_for('static', filename='ckeditor/ckeditor.js') }}"&gt;&lt;/script&gt;
{% endblock %}</pre>
<p>其他步骤相同。</p>
<blockquote>
<p>需要注意的是，我在把文件直接放在static目录下时加载失败，嵌套了一个文件夹后成功：static/ck/ckeditor/，具体原因未知。</p>
</blockquote>
<p>&nbsp;</p>
<h2><b>配置TinyMCE</b></h2>
<p><b>使用CDN</b></p>
<p>首先在表单类里使用定义一个TextAreaField字段：</p>
<pre lang="python">...
body = TextAreaField(u'正文', validators=[DataRequired(u'内容不能为空！')])
...</pre>
<p>使用WTForms或是Flask-Bootstrap渲染表单：</p>
<pre lang="django">...
{{ form.body() }}  &lt;!-- 使用WTForms --&gt;
...</pre>
<p>或是：</p>
<pre lang="django">...
{{ wtf.form_field(form.body) }} &lt;!-- 使用Flask-Bootstrap --&gt;
...</pre>
<p>在模板添加一个head块，然后加载CDN资源，并且初始化。</p>
<pre lang="django">{% block head %}
{{ super() }}
&lt;script src="//cdn.tinymce.com/4/tinymce.min.js"&gt;&lt;/script&gt;
&lt;script&gt;tinymce.init({ selector:'textarea' });&lt;/script&gt;
{% endblock %}</pre>
<blockquote>
<p>如果你使用Flask-Bootstrap，加载其他的JavaScript或是CSS资源时，要使用Jinja2提供的super()函数向父块添加内容，而不是替换父块。更多内容见<a class="" href="http://flask-bootstrap-zh.readthedocs.io/zh/latest/faq.html?highlight=super#jacascript" data-title="相关文档" data-editable="true">相关文档</a>。</p>
</blockquote>
<p>&nbsp;</p>
<p><b>在本地加载</b></p>
<p>下载页面：<a class="" href="https://www.tinymce.com/download/">https://www.tinymce.com/download/</a></p>
<p>下载后解压放到你项目的static文件夹，然后在模板引入文件并初始化：</p>
<pre lang="django">{% block head %}
{{ super() }}
&lt;script src="{{ url_for('static', filename='tinymce/js/tinymce/tinymce.min.js') }}"&gt;&lt;/script&gt;
&lt;script&gt;tinymce.init({ selector:'textarea' });&lt;/script&gt;
{% endblock %}
</pre>
<p>其他步骤相同。</p>
<blockquote>
<p>如果需要更高级的配置，见各自网站上的文档。</p>
</blockquote>
<p>&nbsp;</p>
<h2><b>富文本的渲染</b></h2>
<p>渲染HTML格式的内容时要使用<b>|safe</b>后缀，这样可以让Jinja2不要转义HTML元素，类似这样：</p>
<pre lang="django">{{ body|safe }}</pre>
<p>关于Jinja2常用的语法和函数的总结，会有一篇文章。</p>
<p>&#8211; &#8211; &#8211; &#8211; &#8211;</p>
<p>更多关于Flask和Web开发的优质原创内容，欢迎关注<a class="" href="https://zhuanlan.zhihu.com/flask" data-editable="true" data-title="Hello, Flask! - 知乎专栏">Hello, Flask! &#8211; 知乎专栏</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/flask-project-for-you-to-add-the-rich-text-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
