Как добавить кнопку для выбора медиа-файлов из библиотеки в редактор TinyMCE в Django?

У меня зарегистрировано приложение blog.apps.BlogConfig для работы с записями, в которое интегрирован TinyMCE с дополнительным функционалом, включая кнопку для загрузки медиафайлов. Я заметил, что эти файлы загружаются в кеш. Также у меня зарегистрировано приложение medialibrary.apps.MedialibraryConfig, которое обрабатывает изображения одной модели и другие файлы другой модели. 

В связи с этим у меня есть вопрос: как можно заменить или изменить кнопку загрузки медиа в TinyMCE, чтобы она позволяла выбирать медиафайлы из medialibrary, аналогично тому, как это реализовано в WordPress? Какие шаги необходимо предпринять для правильной организации этого процесса, и существуют ли какие-либо руководства или мануалы по данной теме?
  • 28 августа 2024 г. 8:24
Ответы на вопрос 1
Для интеграции возможности выбора медиа-файлов из приложения `medialibrary` в редактор TinyMCE в Django вам потребуется несколько шагов. В данном руководстве я помогу вам организовать этот процесс.

### Шаги для реализации

1. **Создайте представление для получения медиа-файлов**: Вам нужно будет создать представление (view), которое будет возвращать список доступных медиа-файлов в формате JSON. Это может быть простой список изображений или других файлов.

    ```python
    from django.http import JsonResponse
    from .models import MediaFile  # Импортируйте свою модель

    def media_list(request):
        media_files = MediaFile.objects.all()  # Получите все медиа-файлы
        files_data = [{"id": media.id, "url": media.file.url} for media in media_files]
        return JsonResponse(files_data, safe=False)
    ```

2. **Настройте URL-ы**: Добавьте URL-адрес для доступности этого представления в `urls.py`.

    ```python
    from django.urls import path
    from .views import media_list

    urlpatterns = [
        path('media-list/', media_list, name='media-list'),
    ]
    ```

3. **Измените конфигурацию TinyMCE**: Вам необходимо добавить кнопку для выбора медиа-файлов и соответствующий JavaScript для управления этой кнопкой. TinyMCE предоставляет возможность добавления кастомных кнопок.

    ```javascript
    tinymce.init({
        selector: 'textarea',  // Ваш селектор
        plugins: 'imagemedia', // добавьте необходимые плагины
        toolbar: 'mybutton | otherbuttons',
        setup: function (editor) {
            editor.ui.registry.addButton('mybutton', {
                text: 'Выбрать медиа',
                onAction: function () {
                    // Получите список файлов
                    fetch('/path/to/media-list/')
                        .then(response => response.json())
                        .then(data => {
                            // Здесь обработайте данные и создайте интерфейс для выбора медиа
                            console.log(data); // для простоты пока выводим в консоль
                        });
                }
            });
        }
    });
    ```

4. **Создайте интерфейс выбора медиа**: Сделайте модальное окно или другой способ отображения доступных медиа-файлов для выбора. Вы можете использовать библиотеку, такую как Bootstrap, для создания модального окна.

5. **Вставка выбранного медиа в TinyMCE**: После выбора файла пользователем, вам необходимо вставить ссылку на медиа-файл в редактор. Это можно сделать внутри обработчика клика по файлу.

    ```javascript
    function insertMediaFile(url) {
        tinymce.activeEditor.insertContent('<img src="' + url + '" />');
        // или другой формат в зависимости от типа медиа
    }
    ```

6. **Тестирование**: После реализации всех вышеуказанных шагов, протестируйте функцию в вашем приложении, чтобы убедиться, что она работает корректно.

### Полезные ресурсы

- [Документация по TinyMCE](https://www.tiny.cloud/docs/)
- [Пример использования модальных окон на Bootstrap](https://getbootstrap.com/docs/5.1/components/modal/)
- [Django Rest Framework](https://www.django-rest-framework.org/) (если вы хотите создать более сложный API для управления медиа-файлами)

Это основная структура для реализации функции выбора медиа-файлов в TinyMCE, используя приложение `medialibrary` в вашем проекте Django. Надеюсь, эти шаги помогут вам реализовать нужный функционал!
Похожие вопросы