Korean translation of http://www.djangoproject.com/documentation/tutorial2
<-- |
[../Tutorial1] |
[../Tutorial3] |
--> |
당신의 첫번째 장고 프로그램 만들기, part 2
Contents
이 문서는 Django 0.9.1을 다룬다. 구버전 : 0.90 docs
By Adrian Holovaty <holovaty@gmail.com>, Translated by [parkpro77]
튜토리얼 1을 끝마치면 이 튜토리얼을 시작한다. 우리는 웹 투표 프로그램을 계속 만들 것이고, 장고가 자동적으로 생성하는 관리자 싸이트에 초점을 맞출 것이다.
{{| 원리
당신의 부원이나 고객을 위해 내용을 추가하고, 바꾸고, 삭제하기 위한 관리자 싸이트를 생성하는 것은 많은 창조성을 필요로 하지 않는 지루한 작업이다. 장고는 모델을 위한 관리자 인터페이스의 창조가 완전하게 자동이다.
장고는 출판업자와 공적인 싸이트 사이가 완전하게 분리되어진 편집국에서 쓰여졌다. 싸이트 관리자는 뉴스 이야기, 이벤트, 스포츠 점수 등을 추가하기 위해 이 시스템을 사용하고, 내용은 공적인 싸이트에 보여졌다. 장고는 싸이트 관리자를 위해 내용을 추가하기 위한 통합된 인터페이스를 만드는 문제를 푼다.
관리자는 싸이트 방문자에 의해 사용되어지는 필연적인 경향은 없다. 그것은 싸이트 관리자를 위한 것이다. |}}
관리자 싸이트 작동 시키기
장고 관리자 싸이트는 초기설정에 의해 작동되어지지 않는다. -- 그것은 어떤 것에 가입을 결정한다. 설치를 위해서 관리자 싸이트를 작동시키기 위해, 이 세가지를 하라:
- 당신의 INSTALLED_APPS 를 구성하기 위해 django.contrib.admin 를 추가하라.
- python manage.py install admin 명령을 실행하라. 이것은 관리자가 필요한 여분의 데이타베이스를 만들 것이다.
- myproject/urls.py 파일에 편집창을 열고, Uncomment this for admin: 아래 라인을 주석처리 하지 않는다. 이 파일은 URLconf 이다; 우리는 다음 튜토리얼에서 URLconf 를 자세히 볼 것이다. 우선은, 당신이 알기 위해 필요한 모든 것은 프로그램들에서 URL roots를 배치하는 것이다.
사용자 계정 만들기
당신의 관리자 싸이트를 위한 슈퍼유저 계정을 만들기 위해 다음 명령을 실행하라.
python manage.py createsuperuser
이 스크립트는 유저네임, 이메일 주소, 패스워드 (두번)를 물어볼 것이다.
개발 서버 시작하기
개발 서버를 시작하고, 관리자 싸이트로 들어가자.
튜토리얼 1에서 했던 것처럼 개발 서버를 시작하라.
python manage.py runserver
이제, 웹 브라우저를 열고, 당신의 로컬 도메인의 "/admin/"으로 가라 -- 예를 들면, http://127.0.0.1:8000/admin/. 그러면 관리자 로그인 화면을 볼 것이다.
관리자 싸이트에 들어가기
이제, 로그인을 시도하자. 당신은 장고 관리자 목록 페이지를 볼 것이다.
초기설정에 의해, 당신은 편집할 수 있는 내용의 두 형식인 groups와 users를 볼 것이다. 이것들은 장고 ships의 핵심적인 특징이다.
관리자가 수정할 수 있는 투표 프로그램 만들기
우리의 투표 프로그램은 어디에 있을까? 그것은 관리자 목록 페이지에는 보여지지 않는다.
한가지 방법이 있다: Poll 객체들이 관리자 인터페이스를 가진다는 Poll 모델에서 우리는 . myproject/polls/models/polls 파일의 편집창을 열고, 관리자 속성을 가진 META 클래스를 추가하기 위해 다음처럼 변환하라.
클래스 META는 이 모델에 대한 항목이 없는 모든 META 데이타를 포함한다.
이제 당신이 편집한 것을 보기 위해 장고 관리자 페이지로 가라. 개발서버를 재시작하지 않는다는 것에 주목하라 -- 그것은 자동 연결 코드이다.
공짜 관리자 기능 알아보기
이제 Poll은 관리자 속성을 가지고, 그것은 관리자 목록 페이지를 보여줄 것이다.
"Polls"을 클릭하라. 이제 당신은 "change list" 페이지에 있다. 이 페이지는 데이타베이스 모든 polls을 보여주고, 그것을 바꾸기 위해 하나를 선택하자. 튜토리얼 1에서 만들었던 "What's up?" poll 이 있다.
"What's up?" poll 을 바꾸기 위해 그것을 클릭하라.
여기에서 주목할만한 것들:
- 그 양식은 Poll 모델로부터 자동적으로 생성되어졌다.
다른 모델 항목 유형들 (meta.DateTimeField, meta.CharField)은 고유의 HTML 입력과 일치한다. 각 항목의 유형은 장고 관리 안에서 그것 자신이 어떻게 보여지는지 알고 있다.
각 DateTimeField 는 공짜 자바스크립트 단축키들을 얻는다. Dates는 "Today" 단축키와 달력 팝업을 얻고, times는 "Now" 단축키와 일반적으로 등록된 시간을 기입하는 편리한 팝업을 얻는다.
페이지의 아래 부분은 몇몇 옵션을 준다:
- Save -- 바꾼 것을 저장하고, 객체의 유형을 위해 change-list page 로 돌아온다.
- Save and continue editing -- 바꾼 것을 저장하고, 이 객체를 위해 관리자 페이지로 다시 돌아온다.
- Save and add another -- 바꾼 것을 저장하고, 새롭게 빈 형태로 돌아온다.
- Delete -- 확인 페이지 삭제하는 것을 보여준다.
"Today"와 "Now" 단축키들을 클릭하기 위해서 "Date published"를 바꿔라. 그 때, "Save and continue editing" 을 클릭하라. 그리고 나서, 오른쪽 위에 "History" 를 클릭하라. 바꾼 사람의 timestamp와 사용자이름과 함께, 장고 관리자를 경유해서 이 객체를 만들었던 모든 과정들을 페이지에서 볼 수 있을 것이다.
관리자 폼의 주문 제작
당신은 코드를 작성하지 않았지만 몇 분후에 놀랄만한 일이 벌어진다.
비트로 이것을 만들자. 우리는 meta.Admin에 fields변수를 추가하는 것에 의해 항목들을 재주문할 수 있다:
그것은 두번째 대신에 첫번째로 보여지는 "Publication date" 를 만들었다.
오직 두개의 항목은 인상적이지 않지만, 직관적인 주문을 하기 위한 수십개의 관리자 폼은 중요하게 사용하는 항목이다.
수십개의 항목들을 가진 폼들이 말하는 것은 당신이 항목구성으로 폼을 분리하기를 원할지도 모른다는 것이다.
fields안 각 튜플의 첫번째 요소는 항목구성의 제목이다. 지금까지 우리의 폼이 무엇을 보았는지가 여기에 있다:
각각의 항목구성에 임의의 HTML 클래스들을 배정할 수 있다. 장고는 처음에 실패했던 특별한 항목구성을 보여주는 "접힘 (collapse)" 를 제공한다. 이것은 평상시 사용하지 않는 수많은 항목들을 포함하는 긴 폼을 가질때 유용하다:
연결된 객체들 추가하기
우리는 Poll 관리자 페이지를 가지고 있다. 하지만 Poll은 다수의 Choice를 가지고 있고, 관리자 페이지는 choices를 볼수가 없다.
그럼에도 불구하고.
이 문제를 푸는 두가지 방법이 있다. 첫번째는 우리가 Poll에서 했던 것처럼 Choice 모델에 그것 자신의 admin 속성을 주는 것이다. 여기에 그것이 무엇처럼 보이는지 볼 수 있다:
이제, "Choices"는 장고 관리에서 이용할 수 있는 옵션이다. "Add choice" 폼은 이와 같이 보인다:
폼에서, "Poll" 항목은 데이타베이스 안에 모든 poll을 포함하는 선택박스이다. 장고는 ForeignKey가 <select> 박스로서 관리자 페이지 안에서 나타날 것이라는 것을 알고 있다. 우리의 경우에, 오직 하나의 poll이 이 포인트에 존재한다.
또한, "Add Another" 가 "Poll"과 나란히 링크되어 있음에 주목하라. 다른 것들과 ForeignKey 로 연결되어 있는 모든 객체들은 자유롭게 이것을 얻는다. "Add Another" 를 클릭할 때, 당신은 "Add poll" 형태를 지닌 팝업 창을 얻을 것이다. 당신이 그 창에서 poll을 추가한다면 "Save" 를 클릭하라. 그러면 장고는 데이타베이스에 poll을 저장할 것이고, 당신이 보고 있는 "Add choice" 폼에 선택된 choice로서 그것을 추가한다.
그러나, 정말, 이것은 시스템에서 Choice 객체들을 추가하는 비효율적인 방법이다. 당신이 Poll 객체를 만들었을 때, 직접적으로 Choices 묶음을 추가할 수 있다면 그게 더 좋은 방법이다. 그렇게 만들어 보자.
Choice 모델을 위해 admin을 이동하라. 그때, ForeignKey(Poll) 항목을 이와 같이 편집하라:
poll = meta.ForeignKey(Poll, edit_inline=meta.STACKED, num_in_admin=3)
이것은 "Choice 객체는 Poll 관리자 페이지에서 편집되어졌다. 초기설정에 의해, 3개의 Choices에 대한 충분한 항목들을 제공한다" 고 말한다.
그리고 나서, core=True 를 주기 위해 Choice에서 다른 항목들을 바꿔라.
이것은 "Poll 관리자 페이지에서 Choice를 편집할 때, 'choice'와 'votes' 항목이 필요하게 되었다. 그것들 중에 적어도 하나의 존재는 새로운 Choice 객체의 추가를 나타내고, 둘 다 없는 것은 존재하는 Choice 객체의 삭제를 나타낸다."
어떻게 그것이 보여지는지 보기 위해 "Add poll" 페이지를 열어라.
그것은 이와 같이 일한다: 연결된 Choices에 대한 3개의 슬롯이 있다 -- num_in_admin 에 의해 명시되어지는 것으로서 -- 하지만 각각의 time은 이미 만들어진 객체를 위해 "Change" 페이지로 다시 돌아오고, 당신은 여분의 슬롯 하나를 얻는다. (연결된 많은 객체들이 어떻게 추가되어질수 있는지 엄격하게 코드화된 제한이 없다.) 당신이 세개 여분의 Choices에 대한 공간을 원했다면, 각 time은 num_extra_on_change=3를 사용할지도 모르는 poll을 바꿨다.
그럼에도 불구하고, 하나의 작은 문제가 있다. 그것은 연결된 Choice 객체들이 들어가는 것에 모든 항목들이 보여지기 위한 많은 화면 공간을 가진다. 그런 이유로, 장고는 보여지기 위해 그때마다 즉시 처리하는 연결된 객체들의 교체 방법을 제공한다:
poll = meta.ForeignKey(Poll, edit_inline=meta.TABULAR, num_in_admin=3)
edit_inline=meta.TABULAR (meta.STACKED 대신에)를 하고나서, 연결된 객체들은 테이블에 기초한 형태로서 더 촘촘하게 보여졌다:
관리자 변환 리스트 제작하기
Poll 관리자 페이지는 보기 좋아지고 있고, 이제 "change list" 페이지를 약간 조정하자 -- 시스템에서 보여주는 모든 polls 중 하나.
그것이 이 지점에서처럼 무엇을 할것 같은지 보자:
초기설정에 의해, 장고는 각 객체의 repr() 을 보여준다. 만약에 우리가 독특한 항목들을 볼 수 있다면 더 유용할지도 모른다. 그것을 하기 위해, 객체를 위한 변환 리스트 페이지에 컬럼으로서, 보여주기 위한 항목 이름들의 튜플인 list_display 옵션을 사용하라:
재미삼아, 튜토리얼 1의 관례적인 함수인 was_published_today 을 포함해 보자:
list_display = ('question', 'pub_date', 'was_published_today'),
이제 poll 변환 리스트 페이지는 이와 같이 보인다:
컬럼의 헤더부분을 클릭하면 그 값들을 분류할 수 있다 -- was_published_today 헤더의 경우는 예외이다. 왜냐하면 임의 함수의 출력에 의한 분류는 지원하지 않기 때문이다. 또한 초기설정에 의해 was_published_today 에 대한 컬럼 헤더가 함수 (공간으로 대체되어진 밑줄과 함께)의 이름인 것에 주목하라. 그러나 short_description 속성을 가진 함수를 주는것에 의해 바꿀 수 있다:
Poll 변환 리스트 페이지에 다른 개선점을 추가하자: Poll.admin에 다음 라인을 추가하라:
list_filter = ['pub_date'],
그것은 사람들이 pub_date 항목에 의한 변환 리스트를 여과할 수 있는 "Filter" 보조바를 추가한다.
보여진 filter의 형식은 당신이 여과하는 항목의 형식에 의존한다. 왜냐하면 pub_date는 DateTimeField이고, 장고는 DateTimeFields에 대해 초기 filter 옵션을 주는 것으로 알고 있다: "Any date," "Today," "Past 7 days," "This month," "This year."
이것은 잘 되어 가고 있다. 몇몇 조사 능력을 추가하자:
search_fields = ['question'],
그것은 변환 리스트의 위에 조사박스를 추가한다. 어떤 사람이 용어를 기입했을 때, 장고는 question 항목에서 조사할 것이다. 당신이 쓰고 싶은 항목들을 사용할 수 있다 -- 그것은 합리적으로 유지하고, 당신의 데이타베이스를 행복하게 유지하기 위해서 비밀리에 LIKE 질의를 사용하기 때문이다.
결과적으로, Poll객체들은 dates를 가지기 때문에, 그것은 date에 의해 주입하는 것에 알맞을 것이다. 이 라인을 추가하라:
date_hierarchy = 'pub_date',
그것은 변환 리스트 페이지의 위에 date에 의한 계층적인 항해를 추가한다. 상위 수준에서, 그것은 이용할 수 있는 모든 years를 보여준다. 그리고 나서, 그것은 months를 결국엔 days를 주입한다.
지금은 변환 리스트들이 공짜 페이지수를 준다는 것이 좋다. 초기설정은 한 페이지 당 50개의 아이템을 보여주는 것이다. 변환 리스트 페이지 수, 조사박스들, 여과, 데이트 계층, 컬럼 헤더 주문등의 모든 일을 당신이 생각하는 것처럼 그들도 할 것이다.
룩앤필 (look and feel) 기능으로 제작하기
각 관리자 페이지 위에 "Django administration"과 "example.com" 이 있다는 것은 터무니 없는 일이다. 그것은 단지 플레이스홀더 텍스트 (placeholder text)일 뿐이다.
그렇지만, 장고의 본래 시스템을 사용하여 바꿀 수 있다. 장고 관리자는 자신에 의해 작동되고, 그것의 연결장치들 (interfaces)은 장고 자신의 본래 시스템을 사용한다. (How meta!)
settings 파일 (myproject/settings.py)을 열고, TEMPLATE_DIRS 를 보아라. TEMPLATE_DIRS 는 장고 템플릿을 재생 (loading)할때 검사하기 위한 파일시스템 디렉토리들의 튜플이다. 그것은 조사 경로이다.
초기설정에 의해, TEMPLATE_DIRS 는 비어 있다. 그래서, 템플릿이 어디에 있는지 장고에게 알리기 위해 라인을 추가하자:
이제 당신이 사용하고 있는 TEMPLATE_DIRS의 어느 디렉토리의 관리자 하위디렉토리 (admin subdirectory)에서 초기 장고 관리자 템플릿 디렉토리 (django/contrib/admin/templates)내에 있는 admin/base_site.html 을 복사하자. 예를 들어, 위와 같이 TEMPLATE_DIRS 가 "/home/mytemplates" 을 포함한다면, django/contrib/admin/templates/admin/base_site.html 을 /home/mytemplates/admin/base_site.html 로 복사하라. 관리자 하위디렉토리라는 것을 잊지 말아라.
그리고 나서, 파일의 편집창에서 당신의 싸이트의 이름과 URL과 함께 일반적인 장고 문서로 바꾸어라.
장고의 초기 관리자 템플릿의 어느 것은 겹칠 수 있다는 것에 주목하라. 템플릿을 겹치기 위해, 당신이 base_site.html 에서 했던 것과 같은 일을 하라 -- 당신의 사용자 디렉토리에서 초기 디렉토리로 그것을 복사하고, 바꾸었다.
영리한 독자는 물어볼 것이다: TEMPLATE_DIRS 가 초기설정에 의해 비어있다면, 어떻게 장고가 초기 관리자 템플릿을 찾을 수 있을까? 대답은 초기설정에 의해, 장고는 예비 시스템으로서 사용하는 각각의 app 패키지내에 templates/ 하위디렉토리를 동적으로 찾는다. 더 많은 정보를 원한다면 loader types documentation 를 참조하라.
관리자 목록 페이지 제작하기
유사한 암시로, 당신은 장고 관리자 목록 페이지를 룩앤필 기능으로 제작하기를 원할지도 모른다.
초기설정에 의해, 그것은 INSTALLED_APPS 구성에 따라 이용할 수 있는 모든 프로그램들이 보여진다. 그러나 어떤 것을 보여주기 위한 순서는 무작위이고, 당신은 배치 (layout)를 위해 특별한 변화를 원할지도 모른다. 결국, 목록은 아마도 관리자의 가장 중요한 페이지이고, 그것은 사용하기에 쉬울 것이다.
사용자에게 템플릿은 admin/index.html 이다. (전 단계에서 admin/base_site.html 처럼 같은 일을 한다 -- 초기 디렉토리로부터 사용자 템플릿 디렉토리로 그것을 복사하라.) 파일의 편집창을 열면 당신은 {% get_admin_app_list as app_list %} 로 불리는 템플릿 태그 사용하는 것을 볼 것이다. 그것은 모든 설치된 장고 프로그램을 복구하는 중요한 것이다. 그것을 사용하는 것 대신에, 내가 생각하는 어떠한 방법에서 객체에 특별한 관리자 페이지들을 하드코드링크 (hard-code links) 할 수 있다.
장고는 이 부분에서 단축키를 제공한다. 관리자 목록 템플릿에 포함하기 위한 템플릿 코드를 얻기 위해서 python manage.py adminindex polls 명령을 실행하라. 그것은 시작점으로서 유용하다.
일반적인 장고 관리 싸이트를 룩앤필 기능으로 제작하는 것에 대해 상세한 설명을 원한다면, [../AdminInterface]를 보아라.
당신이 관리 싸이트에 익숙해졌을 때, 공적인 투표 보기 작업을 시작하기 위해 [../Tutorial3]을 읽어라.