Django | admin 백그라운드 미화 처리 JSONfield

1 간단한 설명
일부 업무 수요에서 모델의 일부 필드에 대해 JSONField 적합한 업무를 사용하지만 이런 필드는 django admin에서 표시하고 수정하는 것이 직관적이고 편리하지 않기 때문에 여기에 생각을 하여 미화 처리JSONField를 했다.
환경은 다음과 같습니다.
  • python 3.5.2
  • django 1.11.1
  • postgresql 9.5.2

  • 2단계 및 코드 예제 설명
    예를 들어 모델을 만들었어요.
    # -*- coding: utf-8 -*-
    
    from django.db import models
    from django.contrib.postgres.fields import JSONField
    
    class Book(models.Model):
        """book model"""
        name = models.CharField('    ', max_length=40, blank=True, default='')
        extra_data = JSONField('    ', default={})
        create_time = models.DateTimeField('    ', auto_now_add=True)
    
        def __str__(self):
            return self.name
    
        class Meta:
            verbose_name = '  '
            verbose_name_plural = '  '

    여기extra_data에서 JSONField를 사용했습니다. 만약 처리를 하지 않으면django admin이 표시하는 스타일은 다음과 같습니다.
    이런 디스플레이, 보기, 수정, 검색은 상대적으로 편리하지 않기 때문에 나중에 jsoneditor로 처리할 계획입니다. 처리된 결과는 다음과 같습니다.
    2.1단계
    2.1.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 = """
        
    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() """ 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.1.2 在 admin.py 中引用

    核心使用 formfield_overrides 设置

    # -*- coding: utf-8 -*-
    
    from django.contrib import admin
    from django.contrib.postgres.fields import JSONField
    
    from djexample.djtools import widgets
    from . import models
    
    
    class CommonAdminMixin(admin.ModelAdmin):
        """Common Admin Mixin"""
        list_max_show_all = 20
        list_per_page = 20
    
        formfield_overrides = {
            JSONField: {'widget': widgets.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', )
    
    
    @admin.register(models.Book)
    class BookAdmin(CommonAdminMixin):
        """docstring for BookAdmin"""
        list_display = ['id', 'name']

    이로써 오버, 로컬 서비스를 실행하면 미화된 인터페이스를 볼 수 있습니다
    2.3 프로젝트 창고
    예는 예시 코드를 참고할 수 있다
    3 참고 문서
  • https://ariesfath.wordpress.c...
  • 좋은 웹페이지 즐겨찾기