---
slug: "add-custom-html-to-inline"
title: "Django Admin の Inlines に独自HTMLを追加したい"
description: "Django Admin の Inline formset (TabularInline / StackedInline) に独自の HTML スニペットや説明文を差し込みたいときの実装パターン。"
url: "https://www.ytyng.com/blog/add-custom-html-to-inline"
publish_date: "2021-01-26T08:21:08Z"
created: "2021-01-26T08:21:08Z"
updated: "2026-05-11T13:11:03.543Z"
categories: ["Django"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20240629/471e4d86a56c4a6187dcbeb7574daa82.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

# Django Admin の Inlines に独自HTMLを追加したい

<p>Django Admin の Inlines に独自HTMLを追加したい場合</p>
<p></p>
<p>Admin や、モデルクラスに独自プロパティを定義して、Inline クラスの fields = とか fieldsets = で扱おうとしてもうまくいきません。</p>
<p>素直に、インラインのテンプレートを延長させるのが良いでしょう。</p>
<p></p>
<pre><span>class MyModel</span><span>Inline</span>(admin.StackedInline):<br />    template = <span>'admin/my_app/my_model_inline.html'<br /></span><span>    </span>model = models.MyModel<br />    extra = ...</pre>
<p></p>
<p>オリジナルのテンプレートは&nbsp;admin/edit_inline/stacked.html として存在しますが、このテンプレートは継承を想定されていないため {% block %} 等が無く、継承して使うことはできません。</p>
<p>そのため、丸コピして、継承可能なインラインテンプレートを作っておくと良い。</p>
<p></p>
<p>admin/edit_inline/stacked.html をコピペして作った</p>
<p>admin/edit_inline/stacked_extendable.html</p>
<pre>{% <span>load </span><span>i18n admin_urls static </span>%}<br /><span>{% comment %}<br /></span><span>デフォルトの stacked inline テンプレートに、<br /></span><span>inline_header, inline_footer のブロックを追加して<br /></span><span>継承で使えるようにした<br /></span><span>{% endcomment %}<br /></span>&lt;<span>div </span><span>class</span><span>="js-inline-admin-formset inline-group"<br /></span><span>     </span><span>id</span><span>="</span>{{ <span>inline_admin_formset</span>.<span>formset</span>.<span>prefix </span>}}<span>-group"<br /></span><span>     </span><span>data-inline-type</span><span>="stacked"<br /></span><span>     </span><span>data-inline-formset</span><span>="</span>{{ <span>inline_admin_formset</span>.<span>inline_formset_data </span>}}<span>"</span>&gt;<br />&lt;<span>fieldset </span><span>class</span><span>="module </span>{{ <span>inline_admin_formset</span>.<span>classes </span>}}<span>"</span>&gt;<br />  &lt;<span>h2</span>&gt;{{ <span>inline_admin_formset</span>.<span>opts</span>.<span>verbose_name_plural</span>|<span>capfirst </span>}}&lt;/<span>h2</span>&gt;<br />{{ <span>inline_admin_formset</span>.<span>formset</span>.<span>management_form </span>}}<br />{{ <span>inline_admin_formset</span>.<span>formset</span>.<span>non_form_errors </span>}}<br /><br />{% <span>for </span><span>inline_admin_form </span><span>in </span><span>inline_admin_formset </span>%}&lt;<span>div </span><span>class</span><span>="inline-related</span>{% <span>if </span><span>inline_admin_form</span>.<span>original </span><span>or </span><span>inline_admin_form</span>.<span>show_url </span>%}<span> has_original</span>{% <span>endif </span>%}{% <span>if </span><span>forloop</span>.<span>last </span><span>and </span><span>inline_admin_formset</span>.<span>has_add_permission </span>%}<span> empty-form last-related</span>{% <span>endif </span>%}<span>" </span><span>id</span><span>="</span>{{ <span>inline_admin_formset</span>.<span>formset</span>.<span>prefix </span>}}<span>-</span>{% <span>if not </span><span>forloop</span>.<span>last </span>%}{{ <span>forloop</span>.<span>counter0 </span>}}{% <span>else </span>%}<span>empty</span>{% <span>endif </span>%}<span>"</span>&gt;<br />  &lt;<span>h3</span>&gt;&lt;<span>b</span>&gt;{{ <span>inline_admin_formset</span>.<span>opts</span>.<span>verbose_name</span>|<span>capfirst </span>}}:&lt;/<span>b</span>&gt; &lt;<span>span </span><span>class</span><span>="inline_label"</span>&gt;{% <span>if </span><span>inline_admin_form</span>.<span>original </span>%}{{ <span>inline_admin_form</span>.<span>original </span>}}{% <span>if </span><span>inline_admin_form</span>.<span>model_admin</span>.<span>show_change_link </span><span>and </span><span>inline_admin_form</span>.<span>model_admin</span>.<span>has_registered_model </span>%} &lt;<span>a </span><span>href</span><span>="</span>{% <span>url </span><span>inline_admin_form</span>.<span>model_admin</span>.<span>opts</span>|<span>admin_urlname</span>:<span>'change' </span><span>inline_admin_form</span>.<span>original</span>.<span>pk</span>|<span>admin_urlquote </span>%}<span>" </span><span>class</span><span>="</span>{% <span>if </span><span>inline_admin_formset</span>.<span>has_change_permission </span>%}<span>inlinechangelink</span>{% <span>else </span>%}<span>inlineviewlink</span>{% <span>endif </span>%}<span>"</span>&gt;{% <span>if </span><span>inline_admin_formset</span>.<span>has_change_permission </span>%}{% <span>translate </span><span>"Change" </span>%}{% <span>else </span>%}{% <span>translate </span><span>"View" </span>%}{% <span>endif </span>%}&lt;/<span>a</span>&gt;{% <span>endif </span>%}<br />{% <span>else </span>%}#{{ <span>forloop</span>.<span>counter </span>}}{% <span>endif </span>%}&lt;/<span>span</span>&gt;<br />      {% <span>if </span><span>inline_admin_form</span>.<span>show_url </span>%}&lt;<span>a </span><span>href</span><span>="</span>{{ <span>inline_admin_form</span>.<span>absolute_url </span>}}<span>"</span>&gt;{% <span>translate </span><span>"View on site" </span>%}&lt;/<span>a</span>&gt;{% <span>endif </span>%}<br />    {% <span>if </span><span>inline_admin_formset</span>.<span>formset</span>.<span>can_delete </span><span>and </span><span>inline_admin_formset</span>.<span>has_delete_permission </span><span>and </span><span>inline_admin_form</span>.<span>original </span>%}&lt;<span>span </span><span>class</span><span>="delete"</span>&gt;{{ <span>inline_admin_form</span>.<span>deletion_field</span>.<span>field </span>}} {{ <span>inline_admin_form</span>.<span>deletion_field</span>.<span>label_tag </span>}}&lt;/<span>span</span>&gt;{% <span>endif </span>%}<br />  &lt;/<span>h3</span>&gt;<br />  <span>{# 追加 #}<br /></span><span>  </span>{% <span>block </span><span>inline_header </span>%}{% <span>endblock </span>%}<br /><br />  {% <span>if </span><span>inline_admin_form</span>.<span>form</span>.<span>non_field_errors </span>%}{{ <span>inline_admin_form</span>.<span>form</span>.<span>non_field_errors </span>}}{% <span>endif </span>%}<br />  {% <span>for </span><span>fieldset </span><span>in </span><span>inline_admin_form </span>%}<br />    {% <span>include </span><span>"admin/includes/fieldset.html" </span>%}<br />  {% <span>endfor </span>%}<br />  {% <span>if </span><span>inline_admin_form</span>.<span>needs_explicit_pk_field </span>%}{{ <span>inline_admin_form</span>.<span>pk_field</span>.<span>field </span>}}{% <span>endif </span>%}<br />  {% <span>if </span><span>inline_admin_form</span>.<span>fk_field </span>%}{{ <span>inline_admin_form</span>.<span>fk_field</span>.<span>field </span>}}{% <span>endif </span>%}<br />  <span>{# 追加 #}<br /></span><span>  </span>{% <span>block </span><span>inline_footer </span>%}{% <span>endblock </span>%}<br />&lt;/<span>div</span>&gt;<br /><br />{% <span>endfor </span>%}<br />&lt;/<span>fieldset</span>&gt;<br />&lt;/<span>div</span>&gt;</pre>
<p><br />継承先の例</p>
<pre>{% <span>extends </span><span>'admin/edit_inline/stacked_extendable.html' </span>%}<br /><br />{% <span>block </span><span>inline_footer </span>%}<br />{% <span>if </span><span>inline_admin_form</span>.<span>original </span>%}<br />  &lt;<span>p</span>&gt;<br />  &lt;<span>a </span><span>href</span><span>="</span>{{ <span>inline_admin_form</span>.<span>original</span>.<span>admin_change_url </span>}}<span>" </span><span>target</span><span>="_blank"</span>&gt;<br />    詳細を表示 &rsaquo;&lt;/<span>a</span>&gt;<br />  &lt;/<span>p</span>&gt;<br />{% <span>endif </span>%}<br />{% <span>endblock </span>%}</pre>
