164 words
1 minute
Pretty-printing all read-only JSON in the Django admin

Pretty-printing all read-only JSON in the Django admin#

I have a bunch of models with JSON fields that are marked as read-only in the Django admin - usually because they’re recording the raw JSON that was imported from an API somewhere to create an object, for debugging purposes.

Here’s a pattern I found for pretty-printing ANY JSON value that is displayed in a read-only field in the admin. Create a template called admin/change_form.html and populate it with the following:

{% extends "admin/change_form.html" %}
{% block admin_change_form_document_ready %}
{{ block.super }}
<script>
Array.from(document.querySelectorAll('div.readonly')).forEach(div => {
let data;
try {
data = JSON.parse(div.innerText);
} catch {
// Not valid JSON
return;
}
div.style.whiteSpace = 'pre-wrap';
div.style.fontFamily = 'courier';
div.style.fontSize = '0.9em';
div.innerText = JSON.stringify(data, null, 2);
});
</script>
{% endblock %}

This JavaScript will execute on every Django change form page, scanning for div.readonly, checking to see if the div contains a valid JSON value and pretty-printing it using JavaScript if it does.

It’s a cheap hack and it works great.

Pretty-printing all read-only JSON in the Django admin
https://mranv.pages.dev/posts/pretty-printing-all-read-only-json-in-the-django-admin/
Author
Anubhav Gain
Published at
2024-05-19
License
CC BY-NC-SA 4.0