Django | admin 백그라운드 미화 처리 JSONfield
3795 단어 djangodjango-adminpython3.x
일부 업무 수요에서 모델의 일부 필드에 대해
JSONField
적합한 업무를 사용하지만 이런 필드는 django admin
에서 표시하고 수정하는 것이 직관적이고 편리하지 않기 때문에 여기에 생각을 하여 미화 처리JSONField
를 했다.환경은 다음과 같습니다.
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 참고 문서
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.