zoukankan      html  css  js  c++  java
  • Django笔记(2)Json字段处理

    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=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

    效果:

    1.     name = fields.MedialNameField() 


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

  • 相关阅读:
    小菜编程成长记(四 业务的封装)
    小菜学Flex2(二 currentState初步使用)
    小菜编程成长记(九 反射——程序员的快乐!)
    小菜编程成长记(一 面试受挫——代码无错就是好?)
    小菜编程成长记(六 关于Flex的争论)
    小菜编程成长记(三 复制VS复用)
    104种木马的清除方法
    细节决定成败打电话和发邮件的细节
    MS SQL Server查询优化方法
    美国西点军校最重要的行为准则:没有任何借口
  • 原文地址:https://www.cnblogs.com/icat-510/p/9132547.html
Copyright © 2011-2022 走看看