Django 5 для начинающих

Прогресс по курсу:  9/1004

11.5 Интеграция WYSIWYG-редактора, установка CKEditor 5
1 из 1 шага пройден

WYSIWYG – это аббревиатура, которая используется для обозначения компьютерных систем редактирования, которые позволяют пользователям максимально легко создавать и редактировать документы, презентации и другие виды цифровых произведений.

Редактор WYSIWYG выполняет это, предоставляя пользователям интерфейс, который позволяет им визуально видеть, как будет выглядеть их конечный результат при его создании или внесении в него изменений. Существует множество WYSIWYG-редакторов, таких как TinyMCE, Froala, CKEditor и т. д.

Предположим, вы создаете приложение для блога, вам нужно много форматировать свой контент, например добавлять различные заголовки, ссылки, изображения и многое другое, в этом случае редактор WYSIWYG может избавить вас от многих проблем. Кроме того, даже если вы не создаете приложение для блога, любому приложению нужны страницы о нас, положениях и условиях, писать их на WYSIWYG сравнительно быстрее.

CKEditor — это HTML-редактор, который встраивается в веб-страницы. Он работает как привычные текстовые редакторы и сразу показывает, как будет выглядеть документ. Отличие в том, что документ сразу создается с использованием языка разметки HTML

Редактор используется для быстрого создания и редактирования веб-страниц. Его можно использовать внутри Django, чтобы создавать и редактировать контент на страницах сайта. Редактор поддерживает множество языков, включая русский.


Установим редактор в виртуальную среду:

pip install django-ckeditor


Зарегистрируем приложение и внесём необходимые настройки в файл settings.py:

INSTALLED_APPS = [
    .....
    .....
    'ckeditor_uploader',
    'ckeditor'
]


STATIC_ROOT = BASE_DIR / 'static/'
CKEDITOR_UPLOAD_PATH = "uploads/"

CKEDITOR_CONFIGS = {
    'awesome_ckeditor': {
        'toolbar': 'full',
        'height': 300,
    },
}


Запустите команду управления статикой. Это скопирует статические файлы в каталог, заданный настройкой STATIC_ROOT:

python manage.py collectstatic


Далее нам нужно добавить маршруты CKEditor, для этого в главном файле urls.py добавьте следующую строку:

path('ckeditor/', include('ckeditor_uploader.urls')),

 

Работа с моделями и формами

Теперь переходим к модели Post, нам необходимо изменить тип TextField у полей description, text на RichTextField:

from ckeditor.fields import RichTextField


class Post(models.Model):
    # поля модели

    description = RichTextField(config_name='awesome_ckeditor', verbose_name='Краткое описание',                   max_length=500)
    text = RichTextField(config_name='awesome_ckeditor', verbose_name='Полный текст записи')

Выполним миграции и запустим сервер.

Первым делом перейдем в админ панель и попробуем добавить новую запись:

Мы видим что редактор успешно добавился и работает. Но на данном этапе он не будет работать в наших формах сайта. Чтобы добавить редактор в форму добавления записи с сайта нам необходимо добавить {{ form.media }} перед нашей формой в файле шаблона post_create.html.

{% extends 'main.html' %}

{% block content %}
<div class="card mb-3 border-0 nth-shadow">
    <div class="card-body">
        <div class="card-title nth-card-title">
            <h4>Добавление статьи</h4>
        </div>
        <form method="post" action="{% url 'post_create' %}" enctype="multipart/form-data">
            {% csrf_token %}
            {{ form.media }}
            {{ form.as_p }}
            <div class="d-grid gap-2 d-md-block mt-2">
                <button type="submit" class="btn btn-dark">Добавить статью</button>
            </div>
        </form>
    </div>
</div>
{% endblock %}


Теперь если мы попробуем добавить запись, мы видим что редактор появился и на этой странице:

Если мы хотим добавить этот редактор в виде виджета(не меняя поля), то мы можем это сделать как в коде ниже, добавим его в файл forms.py:

from ckeditor.widgets import CKEditorWidget


class PostCreateForm(forms.ModelForm):
    """
    Форма добавления статей на сайте
    """
    title = forms.CharField(widget=CKEditorWidget(config_name='awesome_ckeditor'))

    class Meta:
        model = Post
        fields = ('title', 'slug', 'category', 'description', 'text', 'thumbnail', 'status')

 

Корректировка шаблонов полной и краткой статьи

Для правильного отображения контента применяемого от редактора, необходимо в файле post_list.html, а также в post_detail.html к полям {{ post.description }} и {{ post.text }} добавить тег safe:

{% extends 'main.html' %}

{% block content %}
    {% for post in posts %}
        <div class="card mb-3">
            <div class="row">
                <div class="col-4">
                    <img src="{{ post.thumbnail.url }}" class="card-img-top" alt="{{ post.title }}">
                </div>
                <div class="col-8">
                    <div class="card-body">
                        <h5 class="card-title">
                            <a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
                        </h5>
                        <p class="card-text">{{ post.description|safe  }}</p>
                        <small>Добавил {{ post.author.username }}, {{ post.create }},</small>
                        в категорию: <a href="{{ post.category.get_absolute_url }}">{{ post.category.title }}</a>
                    </div>
                </div>
            </div>
        </div>
    {% endfor %}
{% endblock %}


Также внесём изменения в шаблон post_detail.html:

{% extends 'main.html' %}
{% load mptt_tags %}
{% load static %}
{% block content %}
<div class="card mb-3">
	<div class="row">
		<div class="col-4">
			<img src="{{ post.thumbnail.url }}" class="card-img-top" alt="{{ post.title }}" />
		</div>
		<div class="col-8">
			<div class="card-body">
				<h5>{{ post.title }}</h5>
                <p class="card-text">{{ post.description|safe }}</p>
				<p class="card-text">{{ post.text|safe }}</p>
				Категория: <a href="{% url 'post_by_category' post.category.slug %}">{{ post.category.title }}</a> / Добавил: {{ post.author.username }} / <small>{{ post.time_create }}</small>
			</div>
		</div>
	</div>
	{% if post.tags.all %}
	<div class="card-footer border-0">
		Теги записи: {% for tag in post.tags.all %} <a href="{% url 'post_by_tags' tag.slug %}">{{ tag }}</a>, {% endfor %}
	</div>
	{% endif %}
</div>
<div class="card border-0">
	<div class="card-body">
		<h5 class="card-title">
			Комментарии
		</h5>
		{% include 'blog/comments/comments_list.html' %}
	</div>
</div>
{% endblock %}


На этом добавление редактора CKEditor закончено. Более подробнее о настройках этого редактора вы можете посмотреть в его документации.


  • Комментариев
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Мы уже устанавливали редактор в нашем блоге на основе функций, 

не работает ссылка

Изменен Дмитрий Харламов

@Дмитрий_Харламов, спасибо, исправил.

У меня при запуске сервера выпадает предупреждение:

System check identified some issues:

WARNINGS:
?: (ckeditor.W001) django-ckeditor bundles CKEditor 4.22.1 which isn't supported anmyore and which does have unfixed security issues, see for example https://ckeditor.com/cke4/release/CKEditor-4.24.0-LTS . You should consider strongly switching to a different editor (maybe CKEditor 5 respectively django-ckeditor-5 after checking whether the CKEditor 5 license terms work for you) or switch to the non-free CKEditor 4 LTS package. See https://ckeditor.com/ckeditor-4-support/ for more on this. (Note! This notice has been added by the django-ckeditor developers and we are not affiliated with CKSource and were not involved in the licensing change, so please refrain from complaining to us. Thanks.)

System check identified 1 issue (0 silenced).
 

По ссылке открывается такой текст:

⚠️️️ Please note that this release is a part of CKEditor 4 Extended Support Model, only available to customers who decided to acquire the LTS (Long Term Support) version of the editor. All editor versions below 4.24.0-lts can no longer be considered as secure! ⚠️

Это нужно понимать как приглашение попробовать другой WYSIWYG редактор? 

@ilya_kutaev, или поставить 5й: pip install django-ckeditor-5, или искать другой.

@Дмитрий_Селезнев, А почему вы его не использовали? Есть какие-то противопоказания?

Дополнение: сходу не заработал. Я постарался воспроизвести все необходимые настройки, но контрол не отображается в нужном виде, просто область текста. Честно говоря, разбираться не очень хочется, на текущем этапе хотелось бы использовать простые и работающие вещи...

Изменен ilya kutaev

@ilya_kutaev, он относительно новый, и скорее всего сырой, 4й был долгое время как стандарт качества WYSIWYG-редакторов.

@ilya_kutaev, Когда писали эту лекцию, я его пробовал, и он не заработал из коробки. По-быстрому решить это не получилось, я посчитал что он еще сырой, и установил более проверенную версию. Но на тот момент никаких предупреждений при запуске сервера не было. Я думаю чуть позже, все равно разберемся с ним, и переделаем эту лекцию.

@Илья_Перминов, Спасибо!

На первый взгляд django-ckeditor-5 отличается сильно, в нем нет uploader'а, и настройки в документации приведены на несколько экранов...

А есть ли какой-то совсем простой редактор, пусть не поддерживающий все многообразие стилей? Основные стили редактирования - выделения, заголовки, списки, таблички, пожалуй и все

@ilya_kutaev, для этого достаточно поддержки markdown.

@ilya_kutaev, Такое лучше не использовать. Мы подобный редактор использовали в курсе, у блога на функциях. И спустя полгода пришлось убрать эту лекцию. Дело в том, что из-за своей не популярности, они редко обновляются и имеют кучу проблем, начиная от поддержки в браузерах, заканчивая самой поддержкой джанги.

Лучше всего использовать что-то самое популярное, и кастомизировать сам тулбар, убрав лишние функции:

CKEDITOR_CONFIGS = {
    'awesome_ckeditor': {
        'toolbar': 'custom',
        'toolbar_custom': [
            ['Bold', 'Italic', 'Underline'],
            ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'JustifyLeft', 'JustifyCenter',
             'JustifyRight', 'JustifyBlock'],
            ['Link', 'Unlink'],
            ['RemoveFormat', 'Source']
        ],
        'height': 300,
    },
}
Изменен Илья Перминов

@Илья_Перминов, Не знаю, уж больно страшный текст в предупреждении, после которого в сторону CKEditor (не LTS) смотреть как-то не хочется, вряд ли его снова начнут поддерживать, и ситуация не улучшится со временем.

Вы имеете в виду этот редактор - Summernote? Он упомянут в комментах ниже

@ilya_kutaev, да, я про него говорил

@Илья_Перминов, Да, жаль, выглядит он ровно так, как я себе представлял - только нужное и ничего лишнего...

Хотя, по большому счету, если редактор поддерживает Paste, то он может вообще ничего не уметь, тексты проще и удобнее создавать в текстовых редакторах. Попробовал вставлять в него из Libre Office - вполне сносно сохраняется форматирование. По сути все, что в нем нельзя нарисовать, можно вставить.

@ilya_kutaev, Да, мне тоже он понравился, жаль что не стал развиваться дальше. Попробую на днях установить ckeditor 5, и заставить его работать.

Не очень понял этот момент:

"Существует множество WYSIWYG-редакторов, таких как TinyMCEFroalaCKEditor и т. д. Но недавно я наткнулся на очень простой, но гибкий текстовый редактор Summernote. Именно его мы и попробуем добавить в наш блог."

 

А в итоге добавляем CKEditor .

@Aleksandr_Gurov, его убрали, по причине некорректной работы с Bootstrap 5. Исправил текст, спасибо.

@Дмитрий_Селезнев, а в чем проявлялась некорректная работа? У меня он запустился на BS5, на первый взгляд выглядит нормально. Подключается не сложнее CKE4

@ilya_kutaev, часть функций не работала, он в первом блоге использовался.

Изменен Дмитрий Селезнев

"Чтобы добавить редактор в форму добавления записи с сайта нам необходимо добавить {{ form.media }} перед нашей формой." Далее не указано в какой шаблон вносим изменения.

@Николай_Петров, Спасибо, добавили.

Не указано откуда импортировать 

RichTextField для моделей

@Николай_Петров, Спасибо, поправил.

Откуда испортировать виджет CKEditorWidget ??? где это добавлять не понятно (
 

Если мы хотим добавить этот редактор в виде виджета(не меняя поля), то мы можем это сделать как в коде ниже:

class PostCreateForm(forms.ModelForm):
    """
    Форма добавления статей на сайте
    """
    title = forms.CharField(widget=CKEditorWidget(config_name='awesome_ckeditor'))

    class Meta:
        model = Post
        fields = ('title', 'slug', 'category', 'description', 'text', 'thumbnail', 'status')

@No_Name, в формы блога: blog/forms.py, импорт:

from ckeditor.widgets import CKEditorWidget

В шаблон post_detail.html также внесём изменения: ...

Слишком лапидарно :)

@Кирилл_Семенихин, спасибо, исправил.