JsonEditor Integration mit Django Admin
Ich arbeite an der Integration von JSONEditor in den Django Admin. In meinem Modell gibt es ein Feld, in dem Postgres JSON verwendet wird, und der Tree-Editor in dieser Bibliothek ist perfekt.
models.pyclass Executable(models.Model):
""" Simplified model for sake of the question."""
recipe = JSONField(null=True, blank=True)
Ich habe ordentliche Fortschritte gemacht (glaube ich), die JSONEditor-Bibliothek in den entsprechenden Erstellungs- / Bearbeitungsbildschirm im Django-Admin zu integrieren. Die Daten sind wird angezeigt beim Laden korrekt, aber aus irgendeinem Grund werden die Änderungen nicht gespeichert, wenn ich Änderungen im JSONEditorWidget vornehme. Ich bin sicher, es gibt einigesave
Überschreiben Sie, dass ich daran arbeiten muss oder dass mir etwas Offensichtliches fehlt, aber ich bin mir nicht sicher, wohin ich von hier aus gehen soll.
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)