Django 管理中的漂亮打印 d​​jango.db.models.JSONField ?

Fli*_*imm 6 django

Django >= 3.1 支持新的JSONField模型字段。我正在使用这样的一个:

from django.db import models

class Example(models.Model):
    foobar = models.JSONField()
Run Code Online (Sandbox Code Playgroud)

我还将此模型包含在 Django 的管理部分中。然而,该字段只是一个包含 JSON 的简单文本区域,打印得并不漂亮。

我怎样才能确保 Django 管理部分中显示的 JSON 打印得很好,带有缩进,如下所示:

{
  "example": {
     "a": 1,
     "b": 2
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 9

这是一种无需额外第三方包即可缩进 JSON 字段的方法:

import json

from django import forms
from django.contrib import admin


class PrettyJSONEncoder(json.JSONEncoder):
    def __init__(self, *args, indent, sort_keys, **kwargs):
        super().__init__(*args, indent=2, sort_keys=True, **kwargs)


class MyModelForm(forms.ModelForm):
    json_field = forms.JSONField(encoder=PrettyJSONEncoder)


class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm
Run Code Online (Sandbox Code Playgroud)

  • 在我的例子中重新定义字段会导致丢失模型中定义的帮助文本。我最终所做的与@toabi建议的类似,我在 `MyModelForm` `__init__` `self.fields['json_field'].encoder = PrettyJSONEncoder` 中完成了它 (2认同)

小智 4

我一直在寻找同样的东西并找到了这篇文章,其中他们使用pygments 模块: https: //daniel.feldroy.com/posts/pretty-formatting-json-django-admin

import json
from django.contrib import admin
from pygments import highlight
from pygments.lexers import JsonLexer
from pygments.formatters import HtmlFormatter
from django.utils.safestring import mark_safe

class YourModelAdmin(admin.ModelAdmin):

    def pretty_json(self, instance):
        """Function to display pretty version of our data"""

        # Convert the data to sorted, indented JSON
        response = json.dumps(instance.metadata, sort_keys=True, indent=2) # <-- your field here

        # Truncate the data. Alter as needed
        response = response[:5000]

        # Get the Pygments formatter
        formatter = HtmlFormatter(style='colorful')

        # Highlight the data
        response = highlight(response, JsonLexer(), formatter)

        # Get the stylesheet
        style = "<style>" + formatter.get_style_defs() + "</style><br>"

        # Safe the output
        return mark_safe(style + response)

    pretty_json.short_description = 'Pretty json'
Run Code Online (Sandbox Code Playgroud)