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에 따라 라이센스가 부여됩니다.