在Django管理中显示JSON字段

Bok*_*oky 2 python django json

我有一个Django模型,如下所示:

class BodyHeight(models.Model):
    seats = models.ForeignKey(to=Seats)
    name = models.CharField(max_length=127, null=True, blank=True)
    key = models.CharField(max_length=100, null=True)
    data = models.TextField(null=True, blank=True)

    class Meta:
        verbose_name_plural = "Body heights"

    def __str__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

然后在data字段中存储json数据,如下所示:

{"url": "https://some_url=/BE?category=COMMERCIAL, "images": ["url_to_some_image"]}
Run Code Online (Sandbox Code Playgroud)

我想仅在Django管理面板中显示该字段的网址。

我现在有:

class BodyHeightAdmin(admin.ModelAdmin):
    search_fields = ('name', )
    list_display = ('id', 'name', 'key', )
    list_display_links = ('id', 'name', 'key', )

admin.site.register(BodyHeight, BodyHeightAdmin)
Run Code Online (Sandbox Code Playgroud)

那是没有数据字段。如果我datalist_display其中添加的字段显示的是整个json(丑陋的格式),但我只想要url

任何想法如何做到这一点?

Bok*_*oky 6

我改变了bodyHeightAdmin类如下:

class BodyHeightAdmin(admin.ModelAdmin):
    search_fields = ('name', )
    list_display = ('id', 'name', 'key', 'url', )
    list_display_links = ('id', 'name', 'key', )

    def url(self, instance):
        data = json.loads(instance.data)
        return data["url"]
Run Code Online (Sandbox Code Playgroud)

它奏效了。


Val*_*lar 5

我在Django Admin中为JSONField添加基本格式的解决方案:

import json
import logging

from django.contrib import admin
from django.contrib.postgres.fields import JSONField
from django.forms import widgets


logger = logging.getLogger(__name__)


class PrettyJSONWidget(widgets.Textarea):

    def format_value(self, value):
        try:
            value = json.dumps(json.loads(value), indent=2, sort_keys=True)
            # these lines will try to adjust size of TextArea to fit to content
            row_lengths = [len(r) for r in value.split('\n')]
            self.attrs['rows'] = min(max(len(row_lengths) + 2, 10), 30)
            self.attrs['cols'] = min(max(max(row_lengths) + 2, 40), 120)
            return value
        except Exception as e:
            logger.warning("Error while formatting JSON: {}".format(e))
            return super(PrettyJSONWidget, self).format_value(value)


class JsonAdmin(admin.ModelAdmin):
    formfield_overrides = {
        JSONField: {'widget': PrettyJSONWidget}
    }
Run Code Online (Sandbox Code Playgroud)

用法:

admin.site.register(models.MyModel, JsonAdmin)
Run Code Online (Sandbox Code Playgroud)

希望对您有帮助!

  • 当字段为_not_只读时有效,但未应用于_readonly_fields_中定义的JSONField。 (7认同)
  • 谢谢你。真正干净的解决方案。 (3认同)
  • 对于任何在 models.py 中使用 django 3.X 和 JSONField (django 的默认字段)尝试此操作的人,您必须使用“from django.db.models import JSONField”而不是“django.contrib.postgres.fields import JSONField” ` (2认同)