Python

Редактирование JSON полей через Django админку

Spread the love

При использование Django админки часто может возникнуть необходимость подключить внешнюю библиотеку. Например если одно или несколько полей в вашей модели являются полями JSON и вам нужно заполнять эти поля в ручную. В этом случае будет правильно настроить сразу JSON редактор на эти поля, что бы облегчить себе работу.

У django есть много дополнительных библиотек с помощью которых это можно сделать, например django-codemirror-widget . Но использование подобных библиотек сильно ограничивает ваши возможности, к примеру лишает возможности выбора редактора, усложняет настройки и т.п. В этом случае предпочтительно подключать внешние библиотеки самостоятельно.

В этой статье я покажу как подключить библиотеку codemirror к полю JSON в админке Django.

Для этого первым делом добавим дополнительный класс на выбранные поля что бы удобно было их потом находить при подключение внешних библиотек. Сделаем это через переопределение админ форм:

from django.contrib import admin
from django import forms

from dialogs.models import Dialog


class DialogAdminForm(forms.ModelForm):
    class Meta:
        model = Dialog
        fields = "__all__"
        widgets = {
            'data': forms.Textarea(attrs={'class': 'json-editor'})
        }

@admin.register(Dialog)
class DialogAdmin(admin.ModelAdmin):
    form = DialogAdminForm

Этим кодом мы добавили класс json-editor к полю data. Далее подготовим JS файл, который свяжет поле и редактор codemirror. Назовем его init.js и разместим его где-нибудь в статике проекта:

(function(){
    var $ = django.jQuery;
    $(document).ready(function(){
        $('.json-editor').each(function(idx, el){

            function getSelectedRange() {
                return { from: editor.getCursor(true), to: editor.getCursor(false) };
            }

            var editor = CodeMirror.fromTextArea(el, {
                lineNumbers: true,
                mode: 'application/json',
                gutters: ['CodeMirror-lint-markers'],
                theme: 'rubyblue',
                lint: true
            });
            CodeMirror.commands["selectAll"](editor);
            var range = getSelectedRange();
            editor.autoFormatRange(range.from, range.to);
            
            range = getSelectedRange();
            editor.commentRange(false, range.from, range.to);
        });
    });
})();

Тут происходит две вещи. Во первых подключаем через jquery к каждому полю у которого есть класс .json-editor редактор CodeMirror с соответствующими опциями (например подключаем тему rubyblue). И второе при запуске сразу запускаем автоформатирование значения поля. Без этого наше значение было отображено в виде строки. Чтобы автоформатирование сработало бы нужно будет подключить дополнительную библиотеку formatting.js

Далее подключим js файлы редактора CodeMirror и наш файл init.js

@admin.register(Dialog)
class DialogAdmin(admin.ModelAdmin):
    form = DialogAdminForm

    class Media:
        css = {
            'all': (
                '/static/codemirror/codemirror.css',
                '/static/codemirror/rubyblue.css',
            )
        }
        js = (
            '/static/codemirror/codemirror.min.js',
            '/static/codemirror/formatting.js',
            '/static/codemirror/javascript.js',
            '/static/codemirror/json-lint.min.js',
            '/static/codemirror/init.js'
        )
    

В этого должно получиться как то так:

Codemirror не единственный js редактор, есть еще очень популярный ace, который можно подключить таким же образом.
Так же для редактирования JSON полей есть еще очень интересный проект jsoneditor . Демо версию данного редактора можно посмотреть тут

Как видите подключая самостоятельно вы не ограничены ни чем и можете использовать любую библиотеку.

Была ли вам полезна эта статья?
[3 / 5]

Spread the love
DenSP

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

12 месяцев ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

12 месяцев ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

2 года ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

2 года ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

2 года ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

2 года ago