JsonEditor 与 Django Admin 集成

2023-11-26

我正在努力整合JSON编辑器进入 Django 管理员。我的模型中有一个字段使用 Postgres JSON,并且该库中的树编辑器非常完美。

模型.py

class Executable(models.Model):
    """ Simplified model for sake of the question."""

    recipe = JSONField(null=True, blank=True)

我已经取得了不错的进展(我认为)将 JSONEditor 库集成到 Django 管理中适当的创建/编辑屏幕中。数据是显示的加载时正确,但由于某种原因,当我在 JSONEditorWidget 中进行编辑时,更改不会保存。我确信有一些save覆盖我需要处理的问题,或者我遗漏了一些明显的东西,但我真的不知道从这里该去哪里。

admin.py

import json
from django import forms, utils
from django.contrib import admin

from .models import Executable


class JSONEditorWidget(forms.Widget):
    html_template = """
        <div id='%(name)s_editor_holder'></div>
        <script type="text/javascript">
                var options = {
                    "mode": "tree",
                    "search": true
                };
                var %(name)s_editor = new JSONEditor(container, options);
                var json = %(value)s
                %(name)s_editor.set(json);
                %(name)s_editor.expandAll();

                var json = %(name)s_editor.get(json);
        </script>
        <textarea readonly class="vLargeTextField" cols="40" id="id_%(name)s" name="%(name)s" rows="2" height="20px">%(value)s</textarea>
    """
    def __init__(self, attrs=None, formats=None, defaults=None):
        self.formats = formats
        self.defaults = defaults
        super(JSONEditorWidget, self).__init__(attrs)

    def render(self, name, value, attrs=None):
        if isinstance(value, basestring):  # Edit existing instance
            value = json.loads(value)
        result = self.html_template % {
            'name': name,
            'value': json.dumps(value)
        }
        return utils.safestring.mark_safe(result)


class ExecutableForm(forms.ModelForm):
    recipe = forms.CharField(widget=JSONEditorWidget())    # Kwargs here?

    class Meta:
        model = Executable
        fields = '__all__'

    class Media:
        css = {
            'all': ('http://www.jsoneditoronline.org/app.min.css',)  # TEMP
        }
        js = (
            'http://www.jsoneditoronline.org/app.min.js',   # TEMP
            )


class ExecutableAdmin(admin.ModelAdmin):
    model = Executable
    form = ExecutableForm
    fields = (('request', 'status'), 'recipe')


admin.site.register(Executable, ExecutableAdmin)

我针对 Django 1.10.2、jsoneditor#^5.5.9、Postgres 9.5 的解决方案:

模型.py

from django.contrib.postgres.fields import JSONField

class Consumer(models.Model):
    data = JSONField(default=dict, db_index=True)

管理员.py:

from django import forms
from django.contrib import admin
from django.utils.safestring import mark_safe
from django.template.loader import render_to_string

from .models import Consumer


class JSONEditorWidget(forms.Widget):

    template_name = 'jsoneditor.html'

    def render(self, name, value, attrs=None):
        context = {
            'data': value,
            'name': name
        }

        return mark_safe(render_to_string(self.template_name, context))


class ConsumerForm(forms.ModelForm):

    class Meta:
        model = Consumer
        fields = '__all__'
        widgets = {
            'data': JSONEditorWidget()
        }

    class Media:
        css = { 'all': ('jsoneditor/dist/jsoneditor.min.css',) }
        js = ('jsoneditor/dist/jsoneditor.min.js', )


class ConsumerAdmin(admin.ModelAdmin):
    list_display = ['pk']
    model = Consumer
    form = ConsumerForm

admin.site.register(Consumer, ConsumerAdmin)

jsoneditor.html:

<div id="{{ name }}_editor"></div>

<textarea cols="40" id="id_{{ name }}" name="{{ name }}" rows="10" required="" style="display: none">{{ data }}</textarea>


<script>
    console.log('jsoneditor.html');
    var container = document.getElementById("{{ name }}_editor");

    var options = {
        modes: ['code', 'tree'],
        search: true,

        onChange: function () {
            var json = editor.get();
            document.getElementById("id_{{ name }}").value=JSON.stringify(json);
        }
    };

    var editor = new JSONEditor(container, options);
    var json = {{ data|safe }};
    editor.set(json);
</script>

块引用 写与堆栈编辑.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JsonEditor 与 Django Admin 集成 的相关文章

随机推荐

  • Lighthouse 错误:“表单元素没有关联的标签”

    如何修复此灯塔错误 表单元素没有关联的标签
  • Flutter 按时间戳对 Firebase 快照进行排序

    I m trying to sort snapshot by timestamp but returns original order data structure looks like this 我有两个快照 时间戳是 153602546
  • 电话验证正则表达式

    我正在使用此模式来检查电话号码的验证 0 9 9 15 它适用于0771234567 and 0771234567 但我希望它适用于077 1234567 and 077 1234567和 077 1 23 45 67 和 077 123
  • 在 Verilog 中生成 For 循环中实例化模块

    我正在尝试使用 Verilog 实例化一些模块generate块 因为我将实例化可变数量的它们 genvar i generate for i 1 i lt 10 i i 1 begin status whatever status clk
  • 无法使用 Rails 5.2、AWS S3 和 ActiveStorage 自动加载常量 ActiveStorage::Blob::Analyzable 错误

    我已经和这个家伙战斗了一段时间了 并且已经完成了所有的谷歌 here here 以及许多同样无益的其他人 但无济于事 官方错误是这样的 在我的创建方法的第一行调用 无法自动加载常量 ActiveStorage Blob Analyzable
  • 是否存在 SHA1(x) 等于 x 的 x?

    有没有一个x where SHA1 x x 我正在寻找证据或强有力的论据来反对它 与问题相同的论点适用于此有MD5定点吗 IE 对于随机选择的函数 该值约为 63
  • Lua表的一个有趣现象

    我是Lua新手 这几天正在学习table的用法 从教程中我知道Lua对待数字索引项和非数字索引项的方式不同 所以我自己做了一些测试 今天我发现一个有趣的现象 我无法解释它 The code t 1 2 3 a a b b print t g
  • android webview youtube 嵌入视频自动播放不起作用

    我无法自动播放我的视频 请帮忙 我的sdk版本 android minSdkVersion 14 android targetSdkVersion 19 gt 我尝试按照代码中指定的方式放置 JavaScript public void o
  • for循环中分号放错位置[重复]

    这个问题在这里已经有答案了 当我做作业时 我犯了一个小错误 在 for 循环中像下面的代码一样 for i 0 i
  • 如何从表单外部捕获表单的某些事件?

    我正在做一些需要监控多种表格的事情 从表单外部 并且不将任何代码放入表单内 我需要以某种方式从这些表单捕获事件 很可能以 Windows 消息的形式 但是 如何从与其相关的类外部捕获 Windows 消息呢 我的项目有一个对象 它包装了它正
  • 如何设置 C++ 函数以便 p/invoke 使用它?

    希望这是一个无脑简单的问题 但这表明我缺乏 C 专业知识 我是一名 C 程序员 过去我使用 P Invoke 和其他人的 C C dll 进行了大量工作 然而 这次我决定自己编写一个包装器 C dll 非托管 然后从 C 调用我的包装器 d
  • 如何使用 Meteor.js 对 Dropbox API 进行 CURL 调用

    我是 Meteor js 新手 希望让我的 Web 应用程序能够与 Dropbox Core API 配合使用 我无法全神贯注于使用 Meteor js 中的 HTTP 包进行 API 调用 如何在 Meteor 中进行类似于下面的 Cur
  • 将常数(2 的幂)除以整数的技巧

    NOTE这是一个理论问题 我对实际代码的性能感到满意 我只是好奇是否有替代方案 有没有一种技巧可以将常量值 本身是 2 的整数幂 除以整数变量值 而无需使用实际的除法运算 The fixed value of the numerator d
  • Ngit 与私钥文件建立连接

    我正在尝试使用 NGit 连接到 Github 即使用私钥和密码 有人可以引导我完成它吗 我的正常获取是 var git Git CloneRepository SetDirectory properties OutputPath SetU
  • 如何从 Vue Composition API / Vue 3.0 + TypeScript 中的组合函数访问根上下文?

    我想创建可重用的包装函数写在打字稿用于通过使用触发 toast 通知复合函数 如 Vue 3 0 的当前规范中所定义 组合 API RFC 此示例使用 BootstrapVue v2 0 toast 组件 对于 Vue 2 它将通过以下方式
  • 将设置保留在数据库中

    在可重用的应用程序中 我不想更改任何代码 我想更改应用程序使用的设置变量 以其形式和其他部分 为动态的 从数据库表更新其内容 最好的方法是什么 也许是中间件 看看Django 数据库设置项目
  • 如何从 numpy 数组生成音频?

    我想从 numpy 中的 2D 数组创建 心率监视器 效果 并希望音调反映数组中的值 您可以使用write功能 from scipy io wavfile创建一个 wav 文件 然后您可以随意播放该文件 请注意 数组必须是整数 因此如果有浮
  • RuntimeError:Matplotlib 动画中没有可用的 MovieWriters

    我遇到的问题是类似于此示例的代码 https matplotlib org examples animation basic example writer html 错误 运行时错误 没有可用的 MovieWriters发生在Writer
  • 赋予 PHP include() 文件父变量作用域

    无论如何 是否可以在调用它的父范围中使用包含的文件 以下示例经过简化 但完成相同的工作 本质上 文件将被函数包含 但希望包含的文件的范围是调用包含该文件的函数的范围 main php
  • JsonEditor 与 Django Admin 集成

    我正在努力整合JSON编辑器进入 Django 管理员 我的模型中有一个字段使用 Postgres JSON 并且该库中的树编辑器非常完美 模型 py class Executable models Model Simplified mod