파이썬 python/django

[django] Django Admin Inline템플릿에 Custom Context 안전하게 전달하는 방법

Aytekin 2025. 4. 16. 17:31
728x90
반응형

 

— get_inline_instances()로 커스텀 컨텍스트(custom context) 주입하기

Django Admin은 뛰어난 기능을 제공하지만, 종종 커스터마이징에는 제한이 따릅니다. 특히, Inline에 custom template을 적용하고, 여기에 개별 객체 정보를 포함한 동적 context를 전달하고 싶을 때 어려움이 있습니다.

 

이 글에서는 get_inline_instances()를 활용해 Django Admin Inline에 안전하게 custom context를 전달하는 가장 실용적인 방법을 소개합니다.


🎯 목표

  • Django Admin의 Inline에 custom template을 사용
  • Inline 템플릿 내에서 동적 정보를 안전하게 활용

🔥 핵심 전략

Django는 Inline을 렌더링할 때 내부적으로 inline_admin_formset.opts를 통해 Inline 클래스 인스턴스를 템플릿에 전달합니다.
우리는 이 opts 객체에 커스텀 context를 직접 주입함으로써 템플릿에서 데이터를 활용할 수 있습니다.


🛠 1단계: Inline 클래스 정의

# admin.py

class MaintainanceOfficeGroupInline(admin.TabularInline):
    model = MaintainanceGroup
    extra = 0
    template = 'custom_inline_maintainance_office_group.html'

custom_inline_maintainance_office_group.html이라는 커스텀 템플릿 파일을 만듭니다. 

이 파일의 경로는 settings.py에서 TEMPLATES에 등록된 디랙토리에 있어야 합니다.


🧩 2단계: Inline을 포함하는 Admin 클래스에서 context 주입

class MaintainanceAdmin(admin.ModelAdmin):
    inlines = [MaintainanceOfficeGroupInline]

    def get_inline_instances(self, request, obj=None):
        inline_instances = super().get_inline_instances(request, obj)

        for inline in inline_instances:
            if isinstance(inline, MaintainanceOfficeGroupInline):
                # 커스텀 context를 직접 주입
                inline.custom_context = {
                    'obj': obj,
                    'site': getattr(obj, 'site', None),
                    'today': datetime.date.today(),
                    'mechanic': getattr(obj, 'assigned_mechanic', None),
                }

        return inline_instances

 

정의한 MaintainanceOfficeGroupInline클래스를 연결하고, get_inline_instances() 객체를 통해 커스텀 정보를 넘겨줍니다.

여기서 custom_context는 템플릿에서 접근 가능한 안전한 컨텍스트 객체로 작동합니다.


🧾 3단계: 커스텀 Inline 템플릿에서 context 활용

{# templates/custom_inline_maintainance_office_group.html #}

{% if inline_admin_formset.opts.custom_context %}
    <p><strong>오늘 날짜:</strong> {{ inline_admin_formset.opts.custom_context.today }}</p>
    <p><strong>사이트:</strong> {{ inline_admin_formset.opts.custom_context.site }}</p>
    <p><strong>담당자:</strong> {{ inline_admin_formset.opts.custom_context.mechanic }}</p>
{% endif %}

{{ inline_admin_formset }}

inline_admin_formset.opts는 해당 inline 클래스의 인스턴스를 참조하므로, 우리가 주입한 custom_context에 직접 접근할 수 있습니다.

 

{{ inline_admin_formset.opts }} == MaintainanceOfficeGroupInline의 객체(object)


⚠️ 주의사항

obj가 None인 경우 Admin의 add 모드에서는 obj가 없을 수 있으므로, .get()이나 getattr()로 안전하게 처리
이름 충돌 방지 custom_context는 Django 내부에서 사용하지 않는 속성이므로 충돌 위험은 적지만, 명확한 네이밍 유지 추천
Django 버전 의존성 이 방식은 Django의 렌더링 방식에 어느 정도 의존하므로 버전 업 시 템플릿 구조 변경 확인 필요

✅ 마무리

Django Admin Inline에 custom context를 전달하고 싶다면, get_inline_instances()를 활용한 인스턴스 주입 방식이 가장 안정적이고 Django의 흐름에도 잘 맞습니다.

 

이 기법을 통해 템플릿에서 동적 정보를 활용할 수 있으며, 다양한 사용자 맞춤형 UI 구성에 유용하게 활용할 수 있습니다.


💡 팁
Inline마다 서로 다른 데이터를 전달하고 싶다면, 각 Inline 클래스별로 다른 custom_context 값을 설정하면 됩니다.

728x90
반응형