1)
Django里面让Model用于JSON字段,添加一个JSONField自动类型如下:
之后就直接为Model定义JSONField类型字段了
使用很方便:
所有可以被json序列化的类型都可以直接赋值给other字段,很方便吧。
2)使用postgreSql作为后端时,提供JSONField字段
from django.contrib.postgres.fields import JSONField
info =JSONField("时空信息",max_length=500,default={},blank=True)
美化后台JSON字段:
1)自定义widget
# -*- coding: utf-8 -*-
import json
from django.forms import Widget
from django.utils.safestring import mark_safe
class JsonEditorWidget(Widget):
"""
在 django admin 后台中使用 jsoneditor 处理 JSONField
TODO:有待改进, 这里使用 % 格式化,使用 format 会抛出 KeyError 异常
"""
html_template = """
<div id='%(name)s_editor_holder' style='padding-left:170px'></div>
<textarea hidden readonly class="vLargeTextField" cols="40" id="id_%(name)s" name="%(name)s" rows="20">%(value)s</textarea>
<script type="text/javascript">
var element = document.getElementById('%(name)s_editor_holder');
var json_value = %(value)s;
var %(name)s_editor = new JSONEditor(element, {
onChange: function() {
var textarea = document.getElementById('id_%(name)s');
var json_changed = JSON.stringify(%(name)s_editor.get()['Object']);
textarea.value = json_changed;
}
});
%(name)s_editor.set({"Object": json_value})
%(name)s_editor.expandAll()
</script>
"""
def __init__(self, attrs=None):
super(JsonEditorWidget, self).__init__(attrs)
def render(self, name, value, attrs=None):
if isinstance(value, str):
value = json.loads(value)
result = self.html_template % {'name': name, 'value': json.dumps(value),}
return mark_safe(result)
2)在admin中引用
from django.contrib import admin
from django.contrib.postgres.fields import JSONField
from djtools import widget
from .models import Person,Tag# Register your models here.
class CommonAdminMixin(admin.ModelAdmin):
"""Common Admin Mixin"""
list_max_show_all = 20
list_per_page = 20
formfield_overrides = {
JSONField: {'widget': widget.JsonEditorWidget}
}
class Media:
from django.conf import settings
static_url = getattr(settings, 'STATIC_URL')
css = {
'all': (static_url + 'jsoneditor.min.css', )
}
js = (static_url + 'jsoneditor-minimalist.min.js', )
#Person模型管理器
admin.site.site_header = '历史时空管理系统'
admin.site.site_title = '历史时空'
@admin.register(Person)
class PersonAdmin(CommonAdminMixin):
pass
效果:
所有可以被json序列化的类型都可以直接赋值给other字段,很方便吧。