1)

Django里面让Model用于JSON字段,添加一个JSONField自动类型如下:

[python] view plain copy
  1. class JSONField(models.TextField):
  2. __metaclass__ = models.SubfieldBase
  3. description = "Json"
  4. def to_python(self, value):
  5. v = models.TextField.to_python(self, value)
  6. try:
  7. return json.loads(v)['v']
  8. except:
  9. pass
  10. return v
  11. def get_prep_value(self, value):
  12. return json.dumps({'v':value})

之后就直接为Model定义JSONField类型字段了

[python] view plain copy
  1. class Category(models.Model):
  2. name = fields.MedialNameField()
  3. other= fields.JSONField()

使用很方便:

[python] view plain copy
  1. Category.objects.create(name="C1", other=(1,2,3,4,5))

所有可以被json序列化的类型都可以直接赋值给other字段,很方便吧。

2)使用postgreSql作为后端时,提供JSONField字段

from django.contrib.postgres.fields import JSONField
info =JSONField("时空信息",max_length=,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 效果:

  1. name = fields.MedialNameField()

所有可以被json序列化的类型都可以直接赋值给other字段,很方便吧。

最新文章

  1. UILabel 根据文本内容设置frame
  2. Jquery,jquery-cookie.js 做的点击记住用户名和密码!
  3. sql表结构和注释
  4. 【代码笔记】iOS-登陆单例
  5. CSS3的chapter1
  6. python调用shell, shell 引用python
  7. 从尾到头打印链表--《剑指offer》
  8. 在JBoss AS7中进行项目部署
  9. C#常用单元测试框架比较:XUnit, NUnit, 和 Visual Studio(MSTest)
  10. java:替换字符串中的ASCII码
  11. mybatis自动生成service、dao、mapper
  12. 236A
  13. 【stylus】stylus在webstrom中的识别
  14. node.js 标准/错误输出 和 process.exit
  15. Tensorflow CNN入门
  16. Failed to get D-Bus connection: Operation not permitted
  17. C/C++ -- Gui编程 -- Qt库的使用 -- HelloWorld
  18. HDU 1027 打印沙漏
  19. 实用的IOS应用程序框架
  20. aws代理

热门文章

  1. 解决搜狗高速模式及设置页面打不开的问题DisableFeature.reg
  2. java翻转字符串中的单词
  3. 二进制编译安装httpd服务
  4. win7颜色反转
  5. 单节点Redis使用 Python pipline大批量插入数据
  6. 第15课 右值引用(2)_std::move和移动语义
  7. centos7 安装后静态ip的配置
  8. Solr——从postgresql数据库导入数据
  9. linux rabbitmq 远程登录
  10. 【Selenium-WebDriver自学】Selenium-IDE模式匹配(六)