당신은 멋쟁이, 우리는 장고쟁이~

0%

Writing your first Django app, part 7 - 4편

admin 모양과 느낌 꾸미기


확실히 django administration 을 어디믄 페이지 상단에 가지는것은 좋아보이지 않습니다.


그저 따분한 타이틀 텍스트 같아 보여서 더더욱이 안좋아 보이고, 지루해 보입니다.



Django 의 템플릿 시스템을 사용하여 바꿀수 있습니다.


Django admin 은 Django 에 의해서 동작하고, 어드민 인터페이스는 Django 의 자체 템플릿 시스템을 사용합니다.


프로젝트의 templates 꾸미기



프로젝트 폴더내에 templates 라는 폴더를 생성합니다 (manage.py 파일과 같은 위치에 생성합니다)


templates 폴더는 Django 가 접근할수 있는 파일 시스템 어디에 위치해 있어도 상관없습니다.


하지만, project 폴더 내에 templates 폴더를 갖게 하는것은 관례적으로 따라하기 좋습니다.



mysite/settings.py 파일을 열고,

TEMPLATES 세팅에 DIR 옵션을 추가해 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]



DIRS 는 파일시스템 폴더들을 가진 리스트입니다.

Django 가 templates 를 읽을때 확인 합니다.



템플릿 정리하기

static files 들과 비슷하게,

우리는 모든 템플릿들을 하나의 큰 템플릿 폴더안에 넣어둘수 있고, 완벽하게 작동할것입니다.

하지만, 특정 어플리케이션을 따르는 템플릿들은

프로젝트의 tempaltes 폴더안에 넣기보다는 어플리케이션의 templates 폴더에 넣습니다.

(예, polls/templates)

resuable app 튜토리얼에서 이것에 대해 더 얘기해볼겁니다



생성된 templates 폴더 안에, admin 폴더를 생성합니다.
그리고, django/contrib/admin/templates 에서 admin/base_site.html 을 복사해서 붙여놓습니다.


아래 커맨드를 실행해서, django 소스 파일들이 어디있는지 찾아냅니다.


1
2
3
4
$ python -c "import django; print(django.__path__)"
(django-tutorial) dhkang  ~/django_tutorial/mysite   master  python -c "import django; print(django.__path__)"
['/home/dhkang/.pyenv/versions/3.7.4/envs/django-tutorial/lib/python3.7/site-packages/django']



해당 경로로 들어가서, base_site.html 파일을 cp 커멘드를 입력하여, mysite/templates 폴더 안에 카피해줍니다.


1
2
 dhkang  ~/.pyenv/versions/3.7.4/envs/django-tutorial/lib/python3.7/site-packages/django/contrib/admin/templates/admin   master  
cp base_site.html ~/django_tutorial/mysite/templates/


admin base_site.html 수정하기


mysite/templates/admin/base_site.html

파일을, 아래와 같이 수정해 줍니다.


1
2
3
4
5
6
7
8
9
{% extends "admin/base.html" %}

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

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

{% block nav-global %}{% endblock %}

이 방식을 사용해서 어떻게 템플릿들을 덮어쓸수 있는지 가르쳐줍니다. 실제 프로젝트에서는, django.contrib.admin.AdminSite.site_header 속성을 사용해서 이런 특수한 꾸미기를 더 쉽게 만들수 있습니다.



1
2
3
4
5
6
7
{% block branding %} 이나 {{ title }} 같은 템플릿 테그들이 이 템플릿 
{% %}{{ }} 태그들은 django 언어들입니다.

Django admin/base_site.html 파일을 그릴때,
이 템플릿 언어들이 검토되어 마지막 HTML 페이지를 그려냅니다.

튜토리얼 part3 에서 이미 확인한 바 있습니다.


Django 의 기본 어드민 템플릿 어떤것이든 덮어써서 사용할수 있습니다.


템플릿을 덮어쓸때에는, base_html 을 덮어쓴 방식과 같은 일을 수행하면 됩니다.


admin 에 들어가서,

템플릿이 잘 수정되었는지 확인 합니다.

Polls Administration 이라고 어드민 페이지 상단에 잘 표시되는걸 확인할수 있습니다.



어플리케이션의 템플릿 꾸미기


눈치빠른 독자들은, 물어볼것입니다.

만약, DIRS 가 기본값으로 비어 있으면, Django 는 어떻게 기본 admin templates 를 찾았을까요?


정답은, APP_DIRS 가 True 로 설정 되어 있었기 때문입니다.


Django 는 자동으로 각 어플리케이션 안에 있는 templates/ 서브 디렉토리를 찾고 폴백으로 사용합니다.

(django.contrib.admin 도 하나의 어플리케이션이란것을 잊지 않습니다)


poll 어플리케이션은 너무 복잡하지 않고, 사용자 정의 admin 템플릿들을 필요로 하지 않습니다.
하지만, 만약 앱이 더 복잡하게 자라나고 Django 의 기본 어드민 템플릿들을 어떤 기능들을 위해서 수정이 필요할때는,
어플리케이션들의 템플릿들을 고쳐주는것이 프로젝트의 템플릿을 고쳐주는것보다 나을것입니다.



이 방식으로, polls application 을 새로운 프로젝트에 포함시킬수 있고, 사용자 정의 템플릿을 필요에 따라 찾을것입니다.



Django 가 어떻게 템플릿들을 찾는지에 대해서는, template loading documentation 문서를 참조합니다.



마치며..


Django 어드민 페이지의 템플릿을 수정해 보았습니다.

어드민 템플릿에서 기존 템플릿 파일을 프로젝트내에 templates/admin 폴더에 복사해서 붙여놓고.

파일을 수정하면 됩니다.