26. Django Admin의 목록 페이지 커스터마이징

data_hamster·2023년 4월 26일
0

학습주제
Django Admin의 목록 페이지 커스터마이징

학습내용
QUESTION의 목록도 보기 좋게 만들어 보려한다.


이 제목은 models.py에서 Question 클래스의 __str__에서 구현한 내용이다.
이렇게 한번에 표시하는 것이 아니라, 컬럼 1개는 제목, 컬럼 1개는 날짜가 나오게 한다.

admin.py로 이동
QuestionAdmin 클래스에서
우리가 표시하고 싶은 필드에
list_display = ('question_text','pub_date')
라고 적어준다.


str에서 제공했던 제목 양식과 달리, question text 내용의 컬럼, pub date 내용의 컬럼으로 나온다. 바로 이렇게 속성에 접근할 수 있다.

models.py - Question - was_published_recently도 표시해보고자 한다.

list_display = ('question_text', 'pub_date', 'was_published_recently')

was_published_recnetly 칼럼이 하나 추가 된 것을 확인할 수 있다.

이제는 제목을 나타내는 레이블인 QUESTION TEXT, PUB DATE 등을 바꾸어 보려고 한다.

models.py로 이동.
question_text = models.CharField(max_length=200, verbose_name='질문') pub_date = models.DateTimeField(auto_now_add=True, verbose_name='생성일')

was_published_recently는 모델에 정의될 필드가 아니라 메소드로 구현되었다. 이때는 admin이라는 데코레이터를 통해서 이 이름을 바꿔준다.

    @admin.display(boolean=True, description='최근생성(하루기준)')
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

admin을 인식하지 못한다.
from django.contrib import admin

boolean=True 부분을 지워보면

이제 question 내에서 Choice를 다룰 수 있으므로, admin.py에서 register 된 choice를 지운다.

Question 목록 검색

  • 날짜기준으로 검색.
    admin.py 이동
    QuestionAdmin 클래스 내에
    list_filter = ['pub_date']

    생성일을 기준으로, 조건에 따라 출력된다.

    장고 admin에서 기본적으로 지원. pub_date는 models.py로 가보면 DateTimeField인 것을 볼 수 있다. 이 DateTimeField를 장고 admin에 list_filter로 제공하면 이 list_filter는 타입을 보고 타입에 맞춰서 이런 옵션들을 자동으로 제공해서 만들어 준다.

이제 질문을 가지고 filter을 만들어 본다. 날짜와 달리 질문은 어떤 단어를 넣어서 찾아야 할 것 같다. 이때는 list_filter를 사용하지 않고, serach_filter를 사용한다.
search_fields = ['question_text']

위에 검색창이 만들어졌다.

다음은 question 내에 choice_text를 가지고 검색하고자 한다.

현재는 안됨.

장고 쉘 필터 복습

question에서 choice 내용을 가져와 본다.

Question.objects.filter(choice__choice_text__startswith="산")

쿼리를 살펴보면

INNER JOIN "polls_choice" ON ("polls_question"."id" = "polls_choice"."question_id")

question.id와 choice 내의 question.id가 같은 걸 기준으로 하는 Join 연산을 했다.

또는 정확히 choice_text 가 "산"은

WHERE 절을 보면 정확히 산인 것을 찾고 있다.

이 WHERE 절을 admin.py - QuestionAdmin - search_fields에 넣어주면 같은 동작을 한다.
search의 기준을 question_text로도 하지만, choice의 choice_text도 검색 기준에 포함시킨다. or 검색

요약

admin.py 에서
출력되는 컬럼을 설정.
list_display = ('question_text', 'pub_date', 'was_published_recently')
Question에 Choice를 컨트롤하기 위해,

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3
    
class QuestionAdmin(admin.ModelAdmin):
    inlines = [ChoiceInline]

읽기전용

class QuestionAdmin(admin.ModelAdmin):
    readonly_fields = ['pub_date']

날짜 등을 필터하기 위해

class QuestionAdmin(admin.ModelAdmin):
    list_filter = ['pub_date']

문장을 필터하기 위해, choice도 검색하기 위해

class QuestionAdmin(admin.ModelAdmin):
    search_fields = ['question_text','choice__choice_text']

models.py에서
칼럼의 이름을 정의하기 위해, 필드일 경우

class Question(models.Model):
    question_text = models.CharField(max_length=200, verbose_name='질문')
    pub_date = models.DateTimeField(auto_now_add=True, verbose_name='생성일')

칼럼의 이름을 정의하기 위해, 메소드일 경우

class Question(models.Model):
    @admin.display(boolean=True, description='최근생성(하루기준)')
    def was_published_recently(self):

관리자의 기능은 admin 내에서 구현하는 것을 추천. 개발시간을 절약할 수 있음.

profile
반갑습니다 햄스터 좋아합니다

0개의 댓글