Ранее мы реализовали написание статей в синтаксисе Markdown. Однако использование Markdown для комментариев к статьям не подходит, вы не можете заставить пользователей потратить время на ознакомление с синтаксисом. Кроме того, обычно присутствуют такие функции, как смайлики и цветные шрифты в комментариях, которых также нет в Markdown.
Итак, редактор форматированного текстаDjango-ckeditorЭто пригодилось.
Использование Ckeditor в фоновом режиме
существуетвиртуальная средаУстановите django-ckeditor в:
(env) > pip install django-ckeditor
После успешной установки это все еще старое правило.settings.py
Зарегистрируйте приложение в:
my_blog/settings.py
...
INSTALLED_APPS = [
...
'ckeditor',
...
]
...
Следующим шагом является модификация модели. Собственные форматированные текстовые поля с библиотекой django-ckeditorRichTextField
Заменить обычные текстовые поляTextField
:
comment/models.py
...
# django-ckeditor
from ckeditor.fields import RichTextField
class Comment(models.Model):
...
# 之前为 body = models.TextField()
body = RichTextField()
...
Не забудьте изменитьПеренести данные:
(env) > python manage.py makemigrations
(env) > python manage.py migrate
Для облегчения тестирования изменитеcomment/admin.py
файл для регистрации модуля комментариев в фоновом режиме:
comment/admin.py
from django.contrib import admin
from .models import Comment
admin.site.register(Comment)
Запустите сервер, войдите на страницу комментариев в фоновом режиме и обнаружите, что django-ckeditor уже доступен:
Функции довольно полные, со шрифтами, размерами шрифтов, цветами, ссылками и выражениями.
Что делать, если мне нужна только часть функциональности? НапримерВставить флеш-анимациюВ принципе бесполезен. Тоже вроде не видитвставить кодовый блокфункция.
ckeditor
позволить вамsettings.py
Настройте конфигурацию в:
my_blog/settings.py
...
CKEDITOR_CONFIGS = {
# django-ckeditor默认使用default配置
'default': {
# 编辑器宽度自适应
'width':'auto',
'height':'250px',
# tab键转换空格数
'tabSpaces': 4,
# 工具栏风格
'toolbar': 'Custom',
# 工具栏按钮
'toolbar_Custom': [
# 表情 代码块
['Smiley', 'CodeSnippet'],
# 字体风格
['Bold', 'Italic', 'Underline', 'RemoveFormat', 'Blockquote'],
# 字体颜色
['TextColor', 'BGColor'],
# 链接
['Link', 'Unlink'],
# 列表
['NumberedList', 'BulletedList'],
# 最大化
['Maximize']
],
# 加入代码块插件
'extraPlugins': ','.join(['codesnippet']),
}
}
существуетtoolbar_Custom
Определите функциональные модули, которые необходимо использовать; функции, которых нет в списке, больше не отображаются. Функция блока кода — это подключаемый модуль, который поставляется вместе с редактором и должен бытьextraPlugins
указывается в использовании. Эффект следующий:
После редактирования форматированного текста его необходимо отобразить во внешнем интерфейсе. Форматированный текст — это что-то вродеhtml
Формат сохраняется, поэтому его нужно добавить в код, выводящий комментарий.|safe
Фильтр для предотвращения экранирования браузера.
Исправлятьdetail.html
Часть кода, показывающая комментарии в:
templates/article/detail.html
...
<!-- 显示评论 -->
<h4>共有{{ comments.count }}条评论</h4>
<div>
{% for comment in comments %}
...
<!-- 修改这里 -->
<div>{{ comment.body|safe }}</div>
{% endfor %}
</div>
...
Войдите на страницу сведений о статье, чтобы увидеть эффект:
подсветка кода
Подсветка кода требует добавления дополнительных плагиновPrism. существуетPrismЗагрузка официальной страницы плагина (также можно нажатьздесьПосле прямой загрузки) распакованныйprism
ставитьenv\Lib\site-packages\ckeditor\static\ckeditor\ckeditor\plugins
Под содержанием. Уведомлениеenv— это каталог созданной вами виртуальной среды.
Все библиотеки, которые вы установили ранее, находятся в этом каталоге env.
затем вофициальный сайт призмыВыберите тему:
- Выберите тему, которая вам нравится
- Затем выберите язык, который хотите выделить. Если вы не знаете, вы можете выбрать все
- Проверьте плагин номера строки
- последний клик
DOWNLOAD CSS
Скачать стиль
существуетstatic
новый в каталогеprism
каталог и поместите в него загруженный файл CSS.
Обратите внимание, что static здесь — это каталог статических файлов в проекте (такой же, как в предыдущей главе), а не статический каталог в папке env.
Затем в коде, который нужно выделитьфайл шаблонаВизуализируйте код, ссылаясь на статический файл prism:
templates/article/detail.html
...
<script src="{% static 'ckeditor/ckeditor/plugins/prism/lib/prism/prism_patched.min.js' %}"></script>
<link rel="stylesheet" href="{% static 'prism/prism.css' %}">
...
будетPrism,widget,lineutilsПлагин добавляется в файл конфигурации. Два последних редактора идут вместе с ними, их не нужно скачивать отдельно, достаточно добавить:
my_blog/settings.py
...
CKEDITOR_CONFIGS = {
'default': {
...
# 添加 Prism 相关插件
'extraPlugins': ','.join(['codesnippet', 'prism', 'widget', 'lineutils']),
}
}
Готово:
Подсветка кода работает отлично!
Использование Ckeditor на переднем плане
Чтобы пользователи могли использовать редактор форматированного текста на переднем плане, необходимо немного изменить код.
Во-первых, вам нужно передать форму комментария на страницу сведений о статье. Так изменитьarticle_detail
Посмотреть:
article/views.py
...
# 引入评论表单
from comment.forms import CommentForm
...
# 文章详情
def article_detail(request, id):
...
# 引入评论表单
comment_form = CommentForm()
context = {
...
'comment_form': comment_form,
}
...
потомdetail.html
Основная часть исходной формы комментария (то есть та, что написана в предыдущей главе<textarea>
) заменяются следующим образом:
templates/article/detail.html
...
<!-- 发表评论 -->
<form ...>
{% csrf_token %}
<div class="form-group">
<label for="body">...</label>
<!-- 将之前的<textarea>替换掉 -->
<!-- <textarea type="text"
class="form-control"
id="body"
name="body"
rows="2"></textarea> -->
<div>
{{ comment_form.media }}
{{ comment_form.body }}
</div>
</div>
<!-- 提交按钮 -->
...
</form>
...
один из нихcomment_form.media
это код рендеринга самого редактора,comment_form.body
поле текста комментария.
Взгляните на эффект:
Да, редактором можно нормально пользоваться, но есть небольшая проблема: кажется, что ширина редактора не адаптивна, а большое пустое пространство справа слишком расточительно. Так держать.
адаптивная ширина
Сначала установите ширину в файле конфигурации какauto
, мы сделали этот шаг.
Сам редактор Ckeditor имеетinline-block
стиль, препятствующий адаптивному эффекту, необходимо использоватьJquery
Синтаксис очищает это. Добавьте код внизу страницы сведений:
templates/article/detail.html
<!-- 注意这是错误的示范! -->
...
<!-- 新增代码 -->
<script>
$(".django-ckeditor-widget").removeAttr('style');
</script>
<!-- 这个已经有了 -->
{% endblock content %}
$
Символы представляют операторы Jquery. Это предложение означает: найти страницуclass='django-ckeditor-widget'
контейнер, затем удалите контейнерstyle
Атрибуты.
Вроде бы и нет проблемы, но баг кроется в деталях. Обратите внимание, что это оператор Jquery, поэтому его необходимо загрузить перед запуском.Jquery.js
. Однако при отображении страницы она содержит$
Приговор{% block content %}
будет вставлен вbase.html
шаблонJquery.js
Перед меткой оператор не вступит в силу, а консоль сообщит$ is not defined
ошибка.
Самый простой способ — упомянуть тег, введенный в Jquery.js, в верхнюю позицию и загрузить его до того, как будет вставлен шаблон блока. Проблема в том, что файлы JS обычно загружаются медленно и блокируют код позади, замедляя общую скорость загрузки страницы. В данной статье такой подход не используется.
Решение находится вbase.html
Добавлено в специальное для сращиванияJavaScript
Расположение скрипта с именем{% block script %}
. Обратите внимание, что он должен быть помещен вJquery
После этикетки:
templates/base.html
...
<body>
...
<!-- 已有代码 -->
<script src="{% static 'jquery/jquery-3.3.1.js' %}"></script>
...
<!-- 新增代码 -->
{% block script %}{% endblock script %}
</body>
потомdetail.html
Поместите код JS в этот блок:
templates/article/detail.html
...
{% block script %}
<script>
$(".django-ckeditor-widget").removeAttr('style');
</script>
{% endblock script %}
Этот метод может гибко определять порядок выполнения JS-скриптов, и код выглядит чище. Рекомендуется вставлять таким образом весь JS-код.
Обновите страницу, и редактор сможет адаптироваться к ширине:
Разместите комментарий с блоком кода, страница сведений будет выглядеть так:
Суммировать
Теперь как посты в блогах, так и комментарии к ним можно красиво оформить. Для некоторых людей, которым не нравится Markdown, можно использовать даже записи в блогах.django-cdeditor
Предоставлен форматированный текстовый редактор. Я сам до сих пор склонен использовать Markdown для написания статей: эффективность написания важнее, чем хороший внешний вид, и почти все основные веб-сайты поддерживают Markdown, поэтому очень удобно публиковать на нескольких платформах.
- Если у вас есть какие-либо вопросы, пожалуйстаЛичный сайт ДьюсиОставьте сообщение, и я отвечу как можно скорее.
- Или напишите мне: dusaiphoto@foxmail.com
- Полный код проекта:Django_blog_tutorial
благодарныйЛичный блог Аарона ЧжаоДана ссылка на эту статью. Также блогер объяснил настройки загрузки картинок в django-ckeditor, если вам интересно, то можете перейти на более подробную информацию.