본문으로 바로가기

Django tutorial 끝내기 with mysql - 4

category Project/gist 2019. 6. 26. 18:03

별도의 Javascript, CSS나 Image를 제공하지 않고 프로젝트를 진행해왔다. 그렇지만 일반적인 웹 페이지에는 이러한 '정적 파일'들을 반드시 제공할 수 있어야 한다. 소규모 프로젝트의 경우, 웹 서버가 정적 파일을 보관할 수 있기 때문에 큰 문제는 아니지만, 더 큰 프로젝트(여러 앱으로 구성된 프로젝트)의 경우에는 각각의 앱별로 제공하는 여러 정적 파일들을 제공하는 것이 까다로워질 수 있다.이 포스팅에서는 django.contrib.staticfiles을 통해 각 응용 프로그램의 정적 파일들을 프로덕션 환경에서 쉽게 제공할 수 있도록 하는 방법을 알아보도록 하겠다. (part6)

Django에서는 자동으로 admin 페이지가 생성된다. 이 페이지를 커스터마이징 하는 방법을 추가로 알아보도록 한다. (part7)


Static files

CSS, Javascript, Image와 같은 정적 파일들을 제공하는 방법은 다음과 같다.

  • polls/static/polls/style.css 파일을 생성하여 스타일을 추가한다. 
  • style.css 파일을 html에서 불러와 적용한다.
  • 서버를 재시작 한다. (python manage.py runserver)

static 디렉토리의 구조와 style.css 구현

Customize the admin form

Django에서 기본적으로 제공하는 admin 페이지를 커스텀할 수 있다. polls/admin.py에서 객체를 등록할 때 원하는 옵션을 알려준다면 원하는 방식대로 보이게 할 수 있다.

fields의 순서 변경

아래처럼 admin.ModelAdmin을 상속하는 QuestionAdmin 클래스를 생성하고 fields의 순서를 지정해주자. 기본적으로 question_text가 우선적으로 노출되던 상세 페이지에서 pub_date가 먼저 보이게 변경된다. 별거 아닌것처럼 보이겠지만 필드의 수가 많을 경우에는 매우 효과적으로 사용할 수 있는 방법이다. 

ㄴ admin 페이지 커스텀 전
ㄴ admin 페이지 커스텀 후

1
2
3
4
5
6
7
8
9
10
11
12
13
# polls/admin.py
from django.contrib import admin
 
from .models import Question, Choice
 
 
class QuestionAdmin(admin.ModelAdmin):
    fields = ['pub_date''question_text']
 
admin.site.register(Question)
admin.site.register(Choice)
 
 
cs

fieldsets 설정

각 튜플의 첫번째 요소는 fieldset의 제목이다. 다음과 같이 처리하면 특정 부분의 정보를 별도의 fieldsets으로 묶을 수 있다.

ㄴ admin 페이지의 fieldset 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# polls/admin.py
from django.contrib import admin
 
from .models import Question, Choice
 
 
class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [('question text information', {'fields' : ['question_text']}),
                 ('Date information', {'fields' : ['pub_date']})
                 ]
 
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
 
 
cs

Adding related objects

Choice의 경우에는 Question과 연관된 객체이므로 별도로 노출시키지 않고 Question 상세 페이지에 Inline 방식으로 함께 노출시킬 수 있다. 그리고 특정 fieldset을 바로 노출시키지 않고 접어 두었다가 클릭 시에 보여줄 수도 있다.

ㄴ Question의 상세 페이지에 Choice 노출 시키기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# polls/admin.py
from django.contrib import admin
 
from .models import Question, Choice
 
 
class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3
 
 
class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [('question text information', {'fields' : ['question_text']}),
                 ('Date information', {
                     'fields' : ['pub_date'],
                     'classes': ['collapse']
                 }),
                 ]
    inlines = [ChoiceInline]
 
 
admin.site.register(Question, QuestionAdmin)
 
 
cs

Admin change list

변경할 항목들의 리스트를 보여주는 페이지도 어떻게 보여줄지 커스텀이 가능하다. 예를 들어서 필드의 값을 바로 노출시킬 수도 있고 메소드의 결과 값을 노출 시키는 것도 가능하다. 

ㄴ 변경할 수 있는 리스트 페이지 (기본)
ㄴ 변경할 수 있는 리스트 페이지 (custom) 

1
2
3
4
5
6
7
8
9
10
11
12
# polls/admin.py
from django.contrib import admin
 
from .models import Question, Choice
 
 
class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question_text''pub_date''was_published_recently')
 
admin.site.register(Question)
 
cs

 

그 외에도 admin 페이지를 다양한 방법으로 커스텀이 가능하다. 하지만 여기서부터는 필요한 경우에 한하여 찾아서 변경하면 되므로 더이상 정리하지 않도록 하겠다. Django tutorial은 천천히 따라하면 Django의 주요 기능들을 한번씩 사용 가능하기 때문에, Django로 처음 프로젝트를 진행하는 거라면 우선 해보는 것이 좋겠다.