Django admin.ModelAdmin.change_list_template 프로그래밍

2024-06-08

Django의 django.contrib.admin에서 admin.ModelAdmin.change_list_template 프로그래밍

change_list_template 속성의 작동 방식:

  1. admin.ModelAdmin 서브클래스에서 change_list_template 속성을 문자열 값으로 설정합니다. 이 문자열은 템플릿 파일의 경로를 나타냅니다. 템플릿 파일은 Django 템플릿 시스템의 규칙에 따라 위치해야 합니다.
  2. Django는 지정된 템플릿 파일을 렌더링하고 컨텍스트 데이터를 제공합니다. 이 컨텍스트 데이터에는 다음과 같은 항목이 포함됩니다.
    • cl: 현재 변경 목록 개체
    • has_change_permission: 사용자가 변경 목록 항목을 변경할 수 있는지 여부를 나타내는 부울 값
    • model_admin: 현재 모델 관리자 개체
    • queryset: 변경 목록에 표시되는 모델 인스턴스 쿼리 세트
  3. 사용자 정의 템플릿은 컨텍스트 데이터를 사용하여 변경 목록을 표시하고 원하는 기능을 추가할 수 있습니다.

다음은 change_list_template 속성을 사용하여 변경 목록 템플릿을 사용자 정의하는 방법의 간단한 예입니다.

from django.contrib import admin

from .models import MyModel


class MyModelAdmin(admin.ModelAdmin):
    change_list_template = 'my_app/admin/change_list.html'


admin.site.register(MyModel, MyModelAdmin)

이 예에서는 MyModel 모델의 변경 목록 템플릿이 my_app/admin/change_list.html 템플릿 파일로 지정됩니다. 이 템플릿 파일은 Django 템플릿 시스템의 규칙에 따라 위치해야 합니다. 템플릿 파일은 cl, has_change_permission, model_adminqueryset와 같은 컨텍스트 데이터에 액세스할 수 있습니다.

  • 변경 목록 뷰의 모양과 동작을 더욱 정교하게 제어할 수 있습니다.
  • 모델별로 변경 목록 뷰를 사용자 정의할 수 있습니다.
  • 변경 목록에 추가 기능을 추가할 수 있습니다.

참고:

  • change_list_template 속성을 사용하려면 django.contrib.admin 앱이 설치되어 있어야 합니다.
  • 사용자 정의 템플릿은 Django 템플릿 시스템의 구문을 따라야 합니다.
  • change_list_template 속성을 사용하면 기본 변경 목록 뷰에서 제공하는 일부 기능이 손실될 수 있습니다.

Django 관리 사이트에서 변경 목록 뷰를 사용자 정의하는 방법에 대한 자세한 내용은 Django 문서를 참조하십시오.



Django admin.ModelAdmin.change_list_template 사용을 위한 관련 샘플 코드

샘플 1: 기본 사용자 정의

이 샘플에서는 change_list_template 속성을 사용하여 기본 변경 목록 템플릿을 사용자 정의하는 방법을 보여줍니다. 이 예에서는 변경 목록 제목을 변경하고 추가 텍스트를 추가합니다.

from django.contrib import admin

from .models import MyModel


class MyModelAdmin(admin.ModelAdmin):
    change_list_template = 'my_app/admin/change_list.html'


admin.site.register(MyModel, MyModelAdmin)

my_app/admin/change_list.html 템플릿은 다음과 같습니다.

{% extends 'admin/change_list.html' %}

{% block object_list %}
  <h1>나의 사용자 정의 변경 목록</h1>

  {{ super() }}

  <p>이것은 변경 목록에 추가된 추가 텍스트입니다.</p>
{% endblock %}

이 템플릿은 admin/change_list.html 템플릿을 확장하고 object_list 블록을 재정의합니다. object_list 블록은 변경 목록 제목을 "나의 사용자 정의 변경 목록"으로 변경하고 변경 목록 아래에 추가 텍스트를 추가합니다.

from django.contrib import admin
from django.db.models import Sum

from .models import MyModel


class MyModelAdmin(admin.ModelAdmin):
    change_list_template = 'my_app/admin/change_list.html'
    grouping = ('status',)


admin.site.register(MyModel, MyModelAdmin)
{% extends 'admin/change_list.html' %}

{% block object_list %}
  {% for group in cl.group_by %}
    <h2>{{ group.key }}</h2>
    <ul>
      {% for object in group.list %}
        <li>
          <a href="{{ object.change_url }}">{{ object }}</a>
        </li>
      {% endfor %}
    </ul>
  {% endfor %}
{% endblock %}

이것은 admin.ModelAdmin.change_list_template 속성을 사용하여 변경 목록 템플릿을 사용자 정의하는 방법의 두 가지 예일 뿐입니다. 템플릿 시스템을 사용하여 변경 목록 뷰를 원하는 대로 사용자 정의할 수 있습니다.

  • 이 샘플 코드는 Django 4.1을 기반으로 합니다.


admin.ModelAdmin.change_list_template의 대안

admin.ModelAdmin.change_view 재정의:

change_view 메서드를 재정의하면 변경 목록 뷰의 전체 HTML을 직접 제어할 수 있습니다. 이 방법은 변경 목록 뷰를 크게 변경하거나 기본 템플릿 시스템으로는 어렵거나 불가능한 사용자 정의를 수행해야 하는 경우에 유용합니다.

from django.contrib import admin

from .models import MyModel


class MyModelAdmin(admin.ModelAdmin):
    def change_view(self, request, object_id, form_url, extra_object_ids):
        # 사용자 정의 HTML을 생성하고 렌더링
        ...

        # HttpResponse 객체를 반환
        return HttpResponse(rendered_html)

ModelAdminMixin 서브클래스를 사용하면 변경 목록 뷰의 특정 부분을 사용자 정의할 수 있는 메서드를 제공합니다. 예를 들어 get_queryset 메서드를 재정의하여 변경 목록에 표시되는 모델 인스턴스를 필터링하거나 get_list_display 메서드를 재정의하여 표시되는 열을 변경할 수 있습니다.

from django.contrib import admin
from django.contrib.admin.views.generic.list import ListAdminMixin


class MyModelAdmin(admin.ModelAdmin, ListAdminMixin):
    def get_queryset(self, request):
        # 변경 목록에 표시할 모델 인스턴스를 필터링
        queryset = super().get_queryset(request)
        return queryset.filter(status='active')

    def get_list_display(self, request):
        # 표시되는 열을 변경
        list_display = super().get_list_display(request)
        list_display.append('created_at')
        return list_display

서드파티 앱 사용:

Django 관리 사이트를 위한 다양한 서드파티 앱이 사용 가능하며 변경 목록 뷰를 사용자 정의하는 데 도움이 될 수 있습니다. 예를 들어 grappelli 앱은 변경 목록 뷰에 대한 다양한 사용자 정의 옵션을 제공합니다.

완전히 사용자 정의된 뷰 작성:

가장 극단적인 방법은 변경 목록 뷰를 위한 완전히 사용자 정의된 Django 뷰를 작성하는 것입니다. 이 방법은 변경 목록 뷰를 완전히 제어해야 하는 경우에 유용하지만 가장 복잡하고 시간이 많이 걸리는 옵션이기도 합니다.

admin.ModelAdmin.change_list_template 사용 여부를 결정하는 방법:

사용할 방법을 결정할 때는 다음과 같은 요소를 고려해야 합니다.

  • 필요한 사용자 정의 수준: 간단한 변경만 필요한 경우 change_list_template 속성을 사용하는 것이 가장 간단합니다. 하지만 변경 목록 뷰를 크게 변경하거나 기본 템플릿 시스템으로는 어렵거나 불가능한 사용자 정의를 수행해야 하는 경우 다른 방법을 고려해야 합니다.
  • 개발자의 기술 수준: change_view 메서드를 재정의하거나 서드파티 앱을 사용하는 것과 같이 일부 방법에는 더 많은 Django 개발 경험이 필요할 수 있습니다.
  • 유지 관리 편의성: admin.ModelAdmin.change_list_template 속성을 사용하면 변경 목록 뷰 코드가 Django 관리 사이트 코드 내에 유지되므로 유지 관리가 더 쉬울 수 있습니다. 하지만 다른 방법을 사용하면 변경 목록 뷰 코드가 별도의 파일에 분리될 수 있으므로 더 유연하고 유지 관리하기 쉬울 수 있습니다.
  • 위에 나열된 대안 외에도 변경 목록 뷰를 사용자 정의하는 데 사용할 수 있는 다른 방법이 있을 수 있습니다.
  • 사용자 정의를 수행하기 전에 Django 관리 사이트 문서를 참조하십시오.