diff --git a/auditlog/mixins.py b/auditlog/mixins.py
index 672ee40..d2e315e 100644
--- a/auditlog/mixins.py
+++ b/auditlog/mixins.py
@@ -62,16 +62,26 @@ class LogEntryAdminMixin(object):
if obj.action == LogEntry.Action.DELETE:
return "" # delete
changes = json.loads(obj.changes)
- msg = "
| # | Field | From | To |
"
- for i, field in enumerate(sorted(changes), 1):
- value = [i, field] + (
- ["***", "***"] if field == "password" else changes[field]
- )
- msg += format_html(
- "| {} | {} | {} | {} |
", *value
- )
- msg += "
"
- return mark_safe(msg)
+ msg = []
+
+ msg.append("")
+ msg.append(self._format_header("#", "Field", "From", "To"))
+ for i, (field, change) in enumerate(sorted(changes.items()), 1):
+ value = [i, field] + (["***", "***"] if field == "password" else change)
+ msg.append(self._format_line(*value))
+ msg.append("
")
+
+ return mark_safe("".join(msg))
msg.short_description = "Changes"
+
+ def _format_header(self, *labels):
+ return format_html(
+ "".join(["", "| {} | " * len(labels), "
"]), *labels
+ )
+
+ def _format_line(self, *values):
+ return format_html(
+ "".join(["", "| {} | " * len(values), "
"]), *values
+ )