================================ 첫 번째 Django 앱 만들기! part 2 ================================ 이 튜토리얼은 :doc:`튜토리얼 1 `\ 에 이어 계속됩니다. 앞서 개발한 투표 애플리케이션과 함께 Django에서 자동으로 생성되는 관리자 사이트에 대해 알아보도록 하겠습니다. .. admonition:: 철학 관리자나 고객들이 컨텐츠를 추가, 변경, 삭제할 수 있는 관리자 사이트를 생성하는 것은 그다지 창조적이지 않은 지루한 작업 입니다. 이러한 작업을 위해서 Django는 모델을 위한 관리자 인터페이스 생성을 완전히 자동화하였습니다. Django는 뉴스를 준비하는 환경을 위해 만들어졌으며, "컨텐츠 발행인"과 "공개" 사이트를 완벽히 분리하였습니다. 사이트 관리자들은 새로운 스토리나 이벤트, 스포츠 점수 결과 등을 추가하기 위해 시스템을 이용하며, 이런 컨텐츠들은 공개 사이트에 노출됩니다. Django는 사이트 관리자들이 컨텐츠를 수정할 수 있는 통합 인터페이스를 제공함으로서 문제를 해결합니다. 관리자 사이트는 사이트 방문자를 위한 것이 아닙니다. 이는 관리자들을 위한 것입니다. 관리자 사이트 활성화 하기 ========================= 관리자 사이트는 활성화되지 않는 것이 기본으로 되어 있습니다. 관리자 사이트를 활성화시키기 위해서는 다음 세 가지의 작업이 필요합니다. * :setting:`INSTALLED_APPS` 설정에 있는 ``"django.contrib.admin"``\ 의 주석을 제거합니다. * ``python manage.py syncdb`` 명령어를 실행합니다. 여러분이 :setting:`INSTALLED_APPS`\ 에 새로운 어플리케이션을 설치하였기 때문에 데이터베이스 테이블을 갱신해야 합니다. * ``mysite/urls.py`` 파일을 열어 관리 사이트에 관련된 행의 주석을 제거합니다. 총 세 행의 주석을 제거해야 합니다. 이 파일은 URL 설정(URLconf) 파일이며 다음 튜토리얼에서 보다 자세히 알아보겠습니다. 지금 여러분이 알아야 할 부분은 URL roots 를 어플리케이션에 연결시키는 것입니다. 연결 후 아래와 같은 ``urls.py`` 파일을 확인하실 수 있습니다. .. parsed-literal:: from django.conf.urls import patterns, include, url # 관리자 사이트를 활성화시키기 위해 다음 두 줄의 주석을 제거해주세요.: **from django.contrib import admin** **admin.autodiscover()** urlpatterns = patterns('', # 예제: # url(r'^$', '{{ project_name }}.views.home', name='home'), # url(r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')), # 관리자 사이트 문서를 활성화시키기 위해 admin/doc 의 주석을 제거해주세요.: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # 관리자 사이트를 활성화 시키기 위해 다음 줄의 주석을 제거해주세요.: **url(r'^admin/', include(admin.site.urls)),** ) (굵게 표시된 행이 주석이 제거된 행입니다.) 개발 서버 실행하기 ================== 이제 개발 서버를 실행시키고 본격적으로 관리자 사이트를 탐험해 보도록 하겠습니다. 첫 번째 튜토리얼에서 배운 내용을 참고하여 아래와 같이 개발 서버를 실행해 보세요. .. code-block:: bash python manage.py runserver 이제 웹 브라우저를 실행하고 로컬 도메인의 "/admin/" 으로 이동하세요 -- 예: http://127.0.0.1:8000/admin/. 관리자 사이트의 로그인 화면을 볼 수 있을 것입니다. .. image:: _images/admin01.png :alt: Django 관리자 사이트 로그인 화면 .. admonition:: 여러분에게 보이는 페이지와 다른가요? 만약 위에서 보이는 로그인 페이지 대신에 아래와 같은 error page reporting이 보인다면:: ImportError at /admin/ cannot import name patterns ... 여러분이 사용하시는 Django의 버전이 본 튜토리얼의 버전과 맞지 않을 수 있습니다. 사용하시는 Django 버전에 맞는 튜토리얼를 참고 하거나, 새로운 버전의 Django를 사용하시기 바랍니다. 관리자 사이트 들어가기 ====================== 자, 이제 로그인 해 보세요. (첫 번째 튜토리얼에서 최고 관리자 계정을 생성한 것을 기억하시나요? 만약 생성하지 않았거나, 비밀번호가 기억나지 않는다면 :ref:`다른 계정을 생성`\ 해 보세요.) 장고 관리자 사이트의 첫 페이지를 확인할 수 있을 것입니다. .. image:: _images/admin02t.png :alt: Django 관리자 사이트 첫 페이지 Groups, users, sites 등 몇 개의 수정 가능한 컨텐츠를 확인할 수 있는데, 이들은 Django에서 기본적으로 제공하는 핵심기능입니다. 관리자 사이트에서 수정 가능한 투표 앱 만들기 ============================================ 그런데 우리의 투표 앱은 어디에 있나요? 아직 관리자 사이트 첫 페이지에 보이지 않습니다. 단 한가지 할 일: 우선 관리자 사이트에게 ``Poll`` 개체가 관리자 인터페이스가 필요하다고 알려줘야 합니다. 이를 위해 ``polls`` 디렉토리 안에 ``admin.py`` 파일을 생성하고 아래와 같이 수정합니다. :: from polls.models import Poll from django.contrib import admin admin.site.register(Poll) 수정사항을 확인하기 위해 개발 서버를 재시작해야 합니다. 일반적으로 파일이 수정되면 서버는 자동으로 수정된 코드를 다시 불러오지만 새로 생성된 파일은 자동으로 불러오지 않습니다. 무료 관리 기능 탐험하기 ======================= 자, 이제 ``Poll``\ 이 등록되었고, Django는 ``Poll``\ 을 관리 사이트 첫 페이지에 보여줘야 함을 알고 있습니다. .. image:: _images/admin03t.png :alt: polls가 보여지는 Django 관리자 사이트 첫 페이지 이제 "Polls"를 클릭하면 polls의 "change list"를 볼 수 있습니다. 이 페이지에서는 데이터베이스의 모든 poll이 보여지게 되며 한 개를 선택하여 변경할 수 있습니다. 여기에 우리가 첫 번째 튜토리얼에서 생성한 "What's up?" poll을 확인할 수 있습니다. .. image:: _images/admin04t.png :alt: Poll 변경 리스트 페이지 Poll을 수정하기 위해 "What's up?" poll을 클릭하세요. .. image:: _images/admin05t.png :alt: Poll 개체 수정 폼 여기서 짚고 넘어가기: * 폼은 Poll 모델로부터 자동적으로 생성되었습니다. * 서로 다른 모델의 필드 타입 (:class:`~django.db.models.DateTimeField`, :class:`~django.db.models.CharField`) 에 따라 적절한 HTML 입력 위젯이 보여집니다. 각각의 필드는 장고의 관리자 사이트에서 어떻게 보여질지 스스로 알고 있습니다. * 각각의 :class:`~django.db.models.DateTimeField`\ 에는 간편한 JavaScript 기능이 제공됩니다. 날짜는 "Today" 바로입력과 달력 팝업이 제공되며, 시간에는 "Now" 바로입력과 일반적으로 시간 입력에 사용되는 간편한 팝업이 제공됩니다. 페이지 하단에는 몇가지 옵션이 제공됩니다. * Save -- 변경사항을 저장하고 현재 개체 타입의 변경된 목록 페이지를 보여줍니다. * Save and continue editing -- 변경사항을 저장하고 현 개체의 관리 페이지를 다시 보여줍니다. * Save and add another -- 변경사항을 저장하고 현재 개체 타입의 신규 정보를 등록할 수 있는 비어있는 폼을 보여줍니다. * Delete -- 삭제 확인 페이지를 보여줍니다. 만약 "Date published"의 시간이 여러분이 튜토리얼 1에서 poll을 생성한 시간과 맞지 않는다면 정확한 :setting:`TIME_ZONE`\ 을 설정하지 않았기 때문일 수 있습니다. 값을 정확히 입력하고 페이지를 다시 읽어들이면 정확한 값이 보여지는 것을 확인할 수 있을 것입니다. "Today" 와 "Now" 바로입력 버튼을 누르면 "Date published"의 정보를 바꿀 수 있습니다. 그리고 "Save and continue editing"을 클릭한 후 오른쪽 위의 "History" 를 클릭해 보세요. 이 페이지 에서는 Django 관리 사이트에서 이루어진 현 개체의 모든 변경 사항의 목록을 확인할 수 있으며, 수정 시간과 수정을 한 사용자 이름도 확인할 수 있습니다. .. image:: _images/admin06t.png :alt: Poll 개체의 History 페이지 관리자 사이트 폼 커스터마이징 ============================= 몇 분 동안 간단히 코드를 살펴보며 감탄하였듯이 여러분은 코드를 작성할 필요가 없습니다. 단지 Poll 모델과 ``admin.site.register(Poll)``\ 을 등록하는 것만으로, Django는 기본적인 폼의 외형을 생성할 수 있습니다. 때때로 여러분은 관리자 사이트 폼의 외형과 작업을 커스터마이즈해야 할 필요가 있을 것입니다. 이는 여러분이 개채를 등록할 때 필요한 옵션을 Django에게 알려주면 됩니다. 수정 폼의 필드를 재정렬하는 예제를 통해서 어떻게 커스터마이즈할 수 있는지 알아봅시다. ``admin.site.register(Poll)`` 라인을 아래와 같이 수정해봅시다. :: class PollAdmin(admin.ModelAdmin): fields = ['pub_date', 'question'] admin.site.register(Poll, PollAdmin) 여러분은 위와 같은 패턴 -- Model admin 개체 생성, ``admin.site.register()``\ 의 두 번째 인자로 전달 -- 을 통해 언제든 개체의 관리 사이트 옵션을 변경할 수 있습니다. 이번 예제는 "Publication date" 필드가 "Question" 필드의 앞에 오도록 수정하였습니다. .. image:: _images/admin07.png :alt: 재정렬된 필드들 단지 두 개의 필드에서는 크게 인상적이지 않을 지 모르지만 수십개의 필드가 있는 폼에서는 직관적인 순서를 선택하는 것이 보다 세세한 사용성 측면에서 중요합니다. 또한 수십개의 필드를 포함한 폼을 다룰 때에는 이들을 폼의 필드셋(fieldsets)으로 분리할 수도 있습니다. :: class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date']}), ] admin.site.register(Poll, PollAdmin) 필드셋의 튜플(tuple)에 있는 각각의 첫 번째 요소는 필드셋의 제목을 의미합니다. 아래에서 우리가 만든 폼이 어떻게 보이는지 확인할 수 있습니다. .. image:: _images/admin08t.png :alt: 필드셋을 보여주는 폼 각각의 필드셋에는 여러분이 원하는 HTML 클래스를 할당할 수 있습니다. Django는 특정 필드셋이 처음에 접혀 있는 모습으로 보여질 수 있도록``"collapse"`` 클래스를 제공합니다. 이는 잘 사용하지 않지만 많은 필드를 가지고 있는 길이가 긴 폼이 있을 때 유용할 것입니다. :: class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] .. image:: _images/admin09.png :alt: 처음에 접혀있는 필드셋 관계 있는 개체 추가 하기 ======================== 자, 이제 우리는 Poll 관리자 페이지를 가지게 되었습니다. 그런데 ``Poll``\ 은 여러개의 ``Choices``\ 를 포함하고 있는데 관리자 페이지는 Choices를 보여주지 않습니다. 아직까지는요. 두 가지 방법을 통해 이 문제를 해결할 수 있습니다. 첫 번째 방법은 관리자 페이지에 ``Poll``\ 과 함께 ``Choice``\ 를 등록하는 것입니다. 참 쉽죠? :: from polls.models import Choice admin.site.register(Choice) 이제 Django 관리자 페이지에서 "Choices"를 사용할 수 있게 되었습니다. 다음 그림과 같은 "Add choice" 폼을 보실 수 있을 것입니다. .. image:: _images/admin10.png :alt: Choice 의 관리 페이지 폼 안에서 "Poll" 필드는 선택 박스(Select Box)로서 데이터베이스의 모든 Poll을 포함하고 있습니다. Django는 :class:`~django.db.models.ForeignKey`\ 가 관리 페이지에서 ``