테이블의 데이터를 변경하는 것이 아니라 테이블을 보여주는 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 테이블의 특정 레코드에 외래키로 연결되어야 한다.
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 속성을 통해 UI 화면 우측에 필터 사이드 바를 붙일 수 있다.
list_filter = ['pub_date']
[FILTER]에는 사용된 기준 필드 타입에 따라 장고가 자동으로 적절한 항목들을 보여준다.
search_fields 속성을 통해 UI 화면에 검색 박스를 표시할 수 있다.
검색 박스에 단어를 입력하면 장고는 LIKE 쿼리로 question_text 필드를 검색한다. search_fields 속성에 여러 개의 필드를 지정하면 지정한 모든 필드에서 입력된 단어를 검색한다.
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로 배우는 파이썬 웹 프로그래밍(기초) - 김석훈님