我有一个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
在数据字段中,我存储了json数据,如下所示:
{"url": "https://some_url=/BE?category=COMMERCIAL, "images": ["url_to_some_image"]}
我想在Django管理面板中只显示该字段的网址。
现在我有:
class BodyHeightAdmin(admin.ModelAdmin):
search_fields = ('name', )
list_display = ('id', 'name', 'key', )
list_display_links = ('id', 'name', 'key', )
admin.site.register(BodyHeight, BodyHeightAdmin)
没有数据字段。如果我在data
中添加list_display
字段而不是整个json(丑陋格式),但我只想要url
。
知道怎么做吗?
答案 0 :(得分:2)
我在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}
}
用法:
admin.site.register(models.MyModel, JsonAdmin)
希望它将对您有帮助!
答案 1 :(得分:1)
我更改了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"]
它有效。
答案 2 :(得分:1)
在这种情况下,将JSONField设置为只读
# set 'url' editable=False in model defintion
class BodyHeightAdmin(admin.ModelAdmin):
search_fields = ('name', )
list_display = ('id', 'name', 'key', 'get_pprint_url', )
list_display_links = ('id', 'name', 'key', )
readonly_fields = ('get_pprint_url', )
def url(self, instance):
data = json.loads(instance.data)
return data["url"]
actions = [
'process_webhook_events',
'reset_webhook_events'
]
def get_pprint_url(self, obj=None):
result = ''
if obj and obj.url:
result = json.dumps(obj.url, indent=4, sort_keys=True)
# keep spaces
result_str = f'<pre>{result}</pre>'
result = mark_safe(result_str)
return result
get_pprint_url.short_description = 'url'
答案 3 :(得分:0)
要在管理页面中显示格式化的JSON,我建议您使用python库django-json-widget
。它易于使用且功能强大(您可以编辑格式化的JSON)。
1)安装库pip install django-json-widget
2)将django-json-widget添加到settings.py中的installed_apps
INSTALLED_APPS = (
...
'django_json_widget',
...
)
3)将以下代码添加到admin.py中(不要忘记用真实的模型名称更改YourModel)
from django.contrib import admin
from django.contrib.postgres import fields
from django_json_widget.widgets import JSONEditorWidget
from .models import YourModel
@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
formfield_overrides = {
fields.JSONField: {'widget': JSONEditorWidget},
}