— 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 값을 설정하면 됩니다.
'파이썬 python > django' 카테고리의 다른 글
[django] Django Admin 메뉴 순서 커스터마이징 – 공백 기반 정렬 방식 (0) | 2025.04.17 |
---|---|
[django] database is locked - 원인파악 | 해결방안 (0) | 2024.11.06 |
[django] model object update 방법 정리 (1) | 2024.10.04 |
[django] django로 포트포워딩(port forwarding)하는 방법 (w. middleware) (0) | 2024.07.25 |
[django] annotate에 관하여... (0) | 2024.07.23 |