If you want to add custom HTML to Django Admin Inlines
Defining custom properties in the Admin or model class and attempting to handle them with Inline class fields= or fieldsets= won’t work well.
It’s better to simply extend the inline template.
class MyModelInline(admin.StackedInline):
template = 'admin/my_app/my_model_inline.html'
model = models.MyModel
extra = ...
The original template exists as admin/edit_inline/stacked.html, but since this template is not designed for inheritance and lacks {% block %} tags, it cannot be used as is.
Therefore, it is better to copy it and create an inheritable inline template.
Copied admin/edit_inline/stacked.html to create
admin/edit_inline/stacked_extendable.html
{% load i18n admin_urls static %}
{% comment %}
Added inline_header, inline_footer blocks
to the default stacked inline template
to make it usable through inheritance
{% endcomment %}
<div class="js-inline-admin-formset inline-group"
id="{{ inline_admin_formset.formset.prefix }}-group"
data-inline-type="stacked"
data-inline-formset="{{ inline_admin_formset.inline_formset_data }}">
<fieldset class="module {{ inline_admin_formset.classes }}">
<h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
{{ inline_admin_formset.formset.management_form }}
{{ inline_admin_formset.formset.non_form_errors }}
{% for inline_admin_form in inline_admin_formset %}<div class="inline-related{% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
<h3><b>{{ inline_admin_formset.opts.verbose_name|capfirst }}:</b> <span class="inline_label">{% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} <a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="{% if inline_admin_formset.has_change_permission %}inlinechangelink{% else %}inlineviewlink{% endif %}">{% if inline_admin_formset.has_change_permission %}{% translate "Change" %}{% else %}{% translate "View" %}{% endif %}</a>{% endif %}
{% else %}#{{ forloop.counter }}{% endif %}</span>
{% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% translate "View on site" %}</a>{% endif %}
{% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission and inline_admin_form.original %}<span class="delete">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</span>{% endif %}
</h3>
{# Added #}
{% block inline_header %}{% endblock %}
{% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %}
{% for fieldset in inline_admin_form %}
{% include "admin/includes/fieldset.html" %}
{% endfor %}
{% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
{% if inline_admin_form.fk_field %}{{ inline_admin_form.fk_field.field }}{% endif %}
{# Added #}
{% block inline_footer %}{% endblock %}
</div>
{% endfor %}
</fieldset>
</div>
Example of inheritance
{% extends 'admin/edit_inline/stacked_extendable.html' %}
{% block inline_footer %}
{% if inline_admin_form.original %}
<p>
<a href="{{ inline_admin_form.original.admin_change_url }}" target="_blank">
View details ›</a>
</p>
{% endif %}
{% endblock %}
Comments