Django

[Django] Admin 커스터마이징 - 투표 앱 만들기(Django tutorial)

TitediosKW 2024. 11. 29. 19:00
반응형

목차

  1. 관리 페이지 커스터마이징
  2. 관련된 객체 추가
  3. Change list 커스터마이징
  4. 결론

Django는 강력하고 유연한 관리자 페이지를 제공합니다. 기본적으로 제공되는 관리자 인터페이스만으로도 충분히 많은 작업을 할 수 있지만, 실제 프로젝트에서는 관리자 페이지를 프로젝트 요구사항에 맞게 커스터마이징 하는 일이 자주 발생합니다. 이번 포스팅에서는 Django Admin 페이지를 커스터마이징 하는 방법을 단계별로 살펴보겠습니다.


1. 관리 페이지 커스터마이징

관리 페이지를 커스터마이징하려면 먼저 admin.py 파일을 수정해야 합니다. 예제를 통해 기본적인 커스터마이징 방법을 알아보겠습니다. 먼저, 변경 전 admin 페이지를 확인해 보겠습니다.

이제 커스터마이징을 해보겠습니다. polls/admin.py 파일의 코드를 아래 코드로 변경해 보겠습니다.

from django.contrib import admin

from .models import Question


class QuestionAdmin(admin.ModelAdmin):
    fields = ["pub_date", "question_text"]


admin.site.register(Question, QuestionAdmin)

admin.ModelAdmin 클래스를 상속하여 QuestionAdmin이라는 클래스를 만들고 이 클래스에서 fields와 같은 속성에 값을 추가합니다. 이후 register 함수에 Question 모델과 QuestionAdmin 클래스를 동시에 등록하면 간편하게 커스터마이징이 가능합니다. 코드를 변경하고 python manage.py runserver 명령을 실행하고 확인하면 아래 화면이 보입니다. 뭐가 바뀌었는지 잘 모르시겠죠? ㅎㅎㅎ 순서가 봐 뀌었습니다.

조금 더 커스터마이징을 해보겠습니다. admin.py 파일의 코드를 수정해 보겠습니다.

from django.contrib import admin

from .models import Question


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {"fields": ["question_text"]}),
        ("Date information", {"fields": ["pub_date"]}),
    ]


admin.site.register(Question, QuestionAdmin)

코드를 수정하면 아래와 같은 화면이 됩니다. 정보를 보여주는 것이 조금 더 상세해진 느낌입니다.

반응형

2. 관련된 객체 추가

Django Admin은 기본적으로 다른 모델과의 관계를 처리할 수 있습니다. 예를 들어, Question 모델과 Choice 모델이 연결되어 있기 때문에, 이를 관리자 페이지에서 더 쉽게 다룰 수 있습니다.

 

admin.py 파일을 아래와 같이 수정해 봅시다. 그렇다면 choice 객체가 추가된 것을 볼 수 있습니다.

from django.contrib import admin

from .models import Choice, Question

# ...
admin.site.register(Choice)

이제 Choice와 Question을 연결하여 봅시다.

from django.contrib import admin

from .models import Choice, Question


class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {"fields": ["question_text"]}),
        ("Date information", {"fields": ["pub_date"], "classes": ["collapse"]}),
    ]
    inlines = [ChoiceInline]


admin.site.register(Question, QuestionAdmin)

 

이번에는 admin.StackedInline 클래스를 상속받아 ChoiceInline 클래스를 만듭니다. 이 클래스에 역시 model, extra 속성을 지정하고 QuestionAdmin 클래스에 inines 속성에 할당합니다. 역시 손쉽게 연관성을 만들 수 있습니다. 우리가 추가했던 Choice들이 Question과 함께 보이는 것을 확인하실 수 있습니다.

 

그런데 Choice들이 너무 크죠? 좀 작고 간단하게 표현했으면 좋겠습니다. 그럴 땐 ChoiceInline 클래스를 만들 때 상속받는 클래스를 아래와 같이 변경하면 됩니다.

class ChoiceInline(admin.TabularInline): ...

 

변경하면 아래와 같이 간단히 표현됩니다.

3. Change list 커스터마이징

Change List는 모델의 객체 목록을 보여주는 페이지입니다. 이 페이지를 커스터마이징하면 더 나은 사용자 경험(UX)을 제공할 수 있습니다.

class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ["question_text", "pub_date", "was_published_recently"]

 

위의 코드는 QuestionAdmin 클래스의 list_display 객체를 추가한 것입니다. 그러니까 Question 모델을 출력할 때 같이 출력할 정보들입니다. 추가하면 아래와 같이 변경됩니다.

 

<변경 전>

 

<변경 후>

 

좋습니다. 이제 필터링을 추가해 보겠습니다. Question 모델에서 발행 날짜로 필터링하는 기능을 만들어 보겠습니다. 그냥 할 수도 있지만 조금 더 예쁘게 보이기 위해 polls/models.py 파일을 변경해 보겠습니다.

from django.contrib import admin


class Question(models.Model):
    # ...
    @admin.display(
        boolean=True,
        ordering="pub_date",
        description="Published recently?",
    )
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

 

그리고 polls/admin.pylist_filter = ["pub_date"] 코드를 추가합니다. QuestionAdmin 클래스에 속성으로 추가하셔야 합니다. ㅎㅎㅎ

 

해당 Question은 발행한 지 한참 지났기 때문에 X로 표시됩니다. 새로 Question 하나를 발행한다면 다른 표시를 보실 수 있습니다.

4. 결론

Django Admin 페이지 커스터마이징은 관리자 경험을 향상하고 프로젝트 요구사항에 맞는 관리 도구를 제공할 수 있는 강력한 방법입니다. 이번 포스팅에서는 관리자 페이지 제목 변경, 관련 객체 추가, Change List 페이지 커스터마이징 등 다양한 방법을 살펴보았습니다. 실제 프로젝트에서 이 방법들을 적절히 조합하여 활용해 보신다면 좀 더 재미있는 실습을 해보실 수 있습니다.

 

궁금한 점이나 추가로 알고 싶은 내용이 있다면 댓글로 알려주세요!

 

도움이 되셨다면 공감 부탁드리겠습니다. 여러분의 공감이 정말 큰 힘이 됩니다.

 

감사합니다!

반응형