Admin 사이트 꾸미기

jurin·2021년 7월 12일
0

필드 순서 변경

테이블의 데이터를 변경하는 것이 아니라 테이블을 보여주는 UI 양식을 변경하려면 voting/admin.py 파일을 변경하면 된다.

from django.contrib import admin
from voting.models import Question, Choice

class QuestionAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question_text'] # 필드 순서 변경

admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)


ModelAdmin 클래스를 상속받아 QuestionAdmin 클래스를 정의하고 그 클래스를 admin.site.register() 함수의 두 번째 인자로 등록해주면 된다.

필드 분리

voting/admin.py 파일 수정하여 각 필드를 분리해서 보여줄 수 있다.

class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        ('Question Statement', {'fields': ['question_text']}),
        ('Date Information', {'fields': ['pub_date']}),
    ]

fieldsets에 있는 각 튜플의 첫 번째 인자가 해당 필드의 제목이 된다.

필드 접기

필드 개수가 많아 폼이 길어진 경우 유용하게 사용할 수 있다. 마찬가지로 admin.py를 수정해준다.

        ('Date Information', {'fields': ['pub_date'], 'classes': ['collapse']}),

외래키 관계
Question과 Choice 모델 클래스는 1:N 관계이고 외래키로 연결되어 있다. 테이블의 외래키 정의가 Admin UI에서 선택 박스 (< select >) 위젯으로 보여주는 것이다.
Choice 테이블의 각 레코드는 독립적으로 생성될 수 없고, Question 테이블의 특정 레코드에 외래키로 연결되어야 한다.

Question 및 Choice 한 화면에서 변경

Choice text를 매번 입력하는 것이 불편하다. 아래처럼 admin.py 파일을 수정하면 Question과 Choice text를 같이 보면서 수정 또는 추가할 수 있다. Question 레코드를 기준으로 여러 개의 Choice 레코드가 연결되는 것이므로, ChoiceAdmin이 아니라 QuestionAdmin 클래스를 수정한다.

class ChoiceInLine(admin.StackedInline):
    model = Choice
    extra = 2

class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None , {'fields': ['question_text']}),
        ('Date Information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInLine]    # Choice 모델 클래스 같이 보기

extra 변수로 지정한 값에 따라 한번에 보여주는 Choice text의 숫자가 결정된다. 이미 2개를 입력한 상황이므로 추가적으로 2개를 더 입력할 수 있다.

테이블 형식으로 보여주기

항목이 많아질 경우 화면이 길어져 불편할 수 있다. 좀 더 보기 편하도록 테이블 형식으로 바꾼다.

voting/admin.py

class ChoiceInLine(admin.TabularInline):
    model = Choice
    extra = 2

삭제하고 싶은 경우 Delete 컬럼에 체크 표시를 하고 SAVE를 누른다. Delete 누르면 질문 자체가 삭제되므로 주의하자!!!!

레코드 리스트 컬럼 지정

Admin 사이트에서 테이블명을 클릭하면 해당 테이블의 레코드 리스트가 나타난다. 이때 장고에서 각 레코드의 제목은 models.py에서 정의한 __str__() 메소드의 리턴값을 레코드의 제목으로 사용한다.

admin.py 파일에 list_display 속성을 추가하면 디폴트 형식이 아닌 레코드 리스트에 보여주는 컬럼 항목을 지정할 수 있다.

list_filter 필터

list_filter 속성을 통해 UI 화면 우측에 필터 사이드 바를 붙일 수 있다.

    list_filter = ['pub_date']

[FILTER]에는 사용된 기준 필드 타입에 따라 장고가 자동으로 적절한 항목들을 보여준다.

search_fields

search_fields 속성을 통해 UI 화면에 검색 박스를 표시할 수 있다.

검색 박스에 단어를 입력하면 장고는 LIKE 쿼리로 question_text 필드를 검색한다. search_fields 속성에 여러 개의 필드를 지정하면 지정한 모든 필드에서 입력된 단어를 검색한다.

Admin 사이트 템플릿 수정

Admin 사이트의 템플릿 파일을 변경하면 Admin 사이트의 모양을 취향에 맞게 수정할 수 있다. 장고의 기본 Admin 템플릿 파일을 우리 프로젝트로 복사해온 다음 이를 변경하면 된다.

우리 프로젝트 내에 템플릿 디렉토리를 새로 만들고 이 디렉토리에 Admin 템플릿 파일을 복사해온다. 이 디렉토리는 개별 애플리케이션에서 사용되는 템플릿이 아니라 프로젝트 전체의 룩앤필에 영향을 주거나 공통적으로 사용되는 템플릿을 담는 프로젝트 템플릿 디렉토리가 된다.

장고의 설치 디렉토리
>python -c "import django; print(django._path_)"

새로 만든 프로젝트 템플릿 디렉토리를 setting.py 파일에 등록해서 장고가 찾을 수 있도록 한다.

TEMPLATES = [
    {
		...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]

base__site.html 파일을 복사했으니 이 파일을 원하는 내용으로 수정하면 된다.

제목을 바꿔보자

<h1 id="site-name"><a href="{% url 'admin:index' %}">Voting Administration</a></h1>

유의사항) 템플릿 파일을 복사해올 때 타깃 디렉토리를 templates가 아닌 templates/admin 디렉토리로 해야 장고가 템플릿 파일을 찾을 수 있다.





출처: Django로 배우는 파이썬 웹 프로그래밍(기초) - 김석훈님

profile
anaooauc1236@naver.com

0개의 댓글