Django admin: delete_confirmation_template の詳細解説


"django.contrib.admin" モジュール内の admin.ModelAdmin クラスは、Django 管理サイトでモデルの管理画面を生成する機能を提供します。その中でも、delete_confirmation_template 属性は、モデル削除確認画面のカスタマイズに使用されるテンプレートファイルを指定します。

詳細

  • 注意事項
    • テンプレートファイルは、Django のテンプレートエンジンで使用される構文に従う必要があります。
    • 削除対象となるモデルオブジェクトの情報は、object 変数を使用してアクセスできます。
    • 削除操作を実行するには、form.delete() メソッドを使用します。
  • テンプレートの内容
    • 削除対象となるモデルオブジェクトの情報が表示されます。
    • 削除操作を実行するためのボタンやフォームが含まれます。
    • 削除操作をキャンセルするためのリンクが含まれます。
  • 設定方法
    • ModelAdmin クラスの delete_confirmation_template 属性にテンプレートファイルのパスを設定します。
    • テンプレートファイルは、プロジェクトの templates ディレクトリ内に配置する必要があります。
  • 役割
    • モデル削除時に表示される確認画面のテンプレートを指定します。
    • デフォルトでは admin/delete_confirmation.html が使用されます。

from django.contrib import admin

class MyModelAdmin(admin.ModelAdmin):
    delete_confirmation_template = 'my_app/admin/delete_confirmation.html'

admin.site.register(MyModel, MyModelAdmin)

上記の例では、my_app/admin/delete_confirmation.html というテンプレートファイルが削除確認画面として使用されます。

  • 詳細については、Django 管理サイトドキュメントを参照してください。
  • delete_confirmation_template 属性以外にも、削除確認画面をカスタマイズするためのオプションがいくつか用意されています。


{% extends "admin/base_site.html" %}

{% block content %}
<h1>削除確認</h1>

<p>以下の項目を削除しますか?</p>

<ul>
    {% for field in object._meta.fields %}
        <li>{{ field.verbose_name }}: {{ object.get(field.name) }}</li>
    {% endfor %}
</ul>

<form action="{% url 'admin:%s_%s_delete' object._meta.app_label object._meta.model_name object.pk %}" method="post">
    {% csrf_token %}
    <input type="hidden" name="action" value="delete">
    <button type="submit">削除</button>
    <a href="{% url 'admin:%s_%s_list' object._meta.app_label object._meta.model_name %}">キャンセル</a>
</form>
{% endblock %}

カスタマイズされたテンプレート (my_app/admin/delete_confirmation.html)

{% extends "admin/base_site.html" %}

{% block content %}
<h1>削除確認</h1>

<p>以下の項目を削除しますか?</p>

<ul>
    <li>名前: {{ object.name }}</li>
    <li>公開日: {{ object.published_date }}</li>
    <li>作成者: {{ object.author }}</li>
</ul>

<p>**注意:** 削除すると元に戻せません。</p>

<form action="{% url 'admin:%s_%s_delete' object._meta.app_label object._meta.model_name object.pk %}" method="post">
    {% csrf_token %}
    <input type="hidden" name="action" value="delete">
    <button type="submit">削除</button>
    <a href="{% url 'admin:%s_%s_list' object._meta.app_label object._meta.model_name %}">キャンセル</a>
</form>
{% endblock %}
  • 削除確認画面をカスタマイズする際には、削除操作の安全性に十分注意する必要があります。
  • 上記のコードはあくまで一例であり、必要に応じて自由にカスタマイズできます。


Django 管理サイトでモデル削除確認画面をカスタマイズするには、admin.ModelAdmin.delete_confirmation_template 属性以外にもいくつかの方法があります。

代替方法

  1. get_delete_confirmation_message メソッド
    • 削除確認画面に表示するメッセージをカスタマイズできます。
    • メッセージは、削除対象となるモデルオブジェクトの情報に基づいて生成されます。
  2. delete_view メソッド
    • 削除確認画面全体を独自に作成できます。
    • ビュー関数を使用して、削除確認ロジックとHTMLテンプレートを自由に実装できます。

各方法の詳細

get_delete_confirmation_message メソッド

  • 以下の例では、オブジェクト名と削除日時を含むメッセージを生成します。
  • メッセージは、削除対象となるモデルオブジェクトの情報に基づいて生成されます。
  • 削除確認画面に表示するメッセージをカスタマイズできます。
from django.contrib import admin

class MyModelAdmin(admin.ModelAdmin):
    def get_delete_confirmation_message(self, request, object):
        return f"以下の項目を削除しますか?\n\n名前: {object.name}\n削除日時: {timezone.now()}"

admin.site.register(MyModel, MyModelAdmin)

delete_view メソッド

  • 以下の例では、admin/delete_confirmation.html というテンプレートファイルを削除確認画面として使用します。
  • ビュー関数を使用して、削除確認ロジックとHTMLテンプレートを自由に実装できます。
  • 削除確認画面全体を独自に作成できます。
from django.contrib import admin
from django.shortcuts import render

class MyModelAdmin(admin.ModelAdmin):
    def delete_view(self, request, object_id):
        context = {
            'object': self.get_object(request, object_id),
        }
        return render(request, 'my_app/admin/delete_confirmation.html', context)

admin.site.register(MyModel, MyModelAdmin)

JavaScript

  • 以下の例では、削除操作を実行する前に確認ダイアログを表示します。
  • 削除確認画面の動作をJavaScriptで拡張できます。
{% extends "admin/base_site.html" %}

{% block content %}
<h1>削除確認</h1>

<p>以下の項目を削除しますか?</p>

<ul>
    {% for field in object._meta.fields %}
        <li>{{ field.verbose_name }}: {{ object.get(field.name) }}</li>
    {% endfor %}
</ul>

<button id="delete-button">削除</button>
<a href="{% url 'admin:%s_%s_list' object._meta.app_label object._meta.model_name %}">キャンセル</a>

<script>
    const deleteButton = document.getElementById('delete-button');
    const deleteUrl = '{% url "admin:%s_%s_delete" object._meta.app_label object._meta.model_name object.pk %}';

    deleteButton.addEventListener('click', () => {
        if (confirm('削除しますか?')) {
            window.location.href = deleteUrl;
        }
    });
</script>

{% endblock %}
  • JavaScriptを使用する場合は、セキュリティ上のリスクに注意する必要があります。
  • 複雑なカスタマイズを行う場合は、delete_view メソッドを使用するのが最も柔軟性があります。
  • 上記の方法は、それぞれ異なるレベルのカスタマイズを提供します。