# 기존 Django 프로젝트에 Wagtail 추가하는 방법 완전히 처음부터 Wagtail을 설치하려면, 새로운 Django 프로젝트와 그 프로젝트 내에 앱을 생성하세요. 이러한 작업에 대한 지침은 [첫 번째 Django 앱 작성하기](inv:django#intro/tutorial01)를 참조하세요. 프로젝트 디렉토리는 다음과 같이 보일 것입니다: ``` myproject/ myproject/ __init__.py settings.py urls.py wsgi.py myapp/ __init__.py models.py tests.py admin.py views.py manage.py ``` 앱 디렉토리에서 `admin.py` 와 `views.py` 를 안전하게 제거할 수 있습니다. Wagtail이 모델에 대한 이 기능을 제공하기 때문입니다. Django가 Wagtail을 로드하도록 구성하려면 `settings.py` 에 모듈과 변수를 추가하고 `urls.py` 에 URL 구성을 추가해야 합니다. 이러한 파일에 정의된 내용에 대한 더 완전한 보기는 [Django 설정](inv:django#topics/settings)과 [Django URL 디스패처](inv:django#topics/http/urls)를 참조하세요. 다음은 많은 상용구 Django 설정을 건너뛰는 설정 참조입니다. 지금 당장 설정에 신경 쓰지 않고 Wagtail 설치를 빠르게 시작하려면 [](complete_example_config)를 참조하세요. ## 미들웨어 (`settings.py`) ```python MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'wagtail.contrib.redirects.middleware.RedirectMiddleware', ] ``` Wagtail은 로그인 세션과 같은 기본 보안 및 기능을 다루기 위해 Django 미들웨어 모듈의 기본 세트에 의존합니다. 추가 미들웨어 모듈이 제공됩니다: **`RedirectMiddleware`** Wagtail은 사이트에 임의의 리디렉션을 추가하기 위한 간단한 인터페이스를 제공하며, 이 모듈이 그것을 가능하게 합니다. ## 앱 (`settings.py`) ```python INSTALLED_APPS = [ 'myapp', # 사용자 자신의 앱 'wagtail.contrib.forms', 'wagtail.contrib.redirects', 'wagtail.embeds', 'wagtail.sites', 'wagtail.users', 'wagtail.snippets', 'wagtail.documents', 'wagtail.images', 'wagtail.search', 'wagtail.admin', 'wagtail', 'taggit', 'modelcluster', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] ``` Wagtail은 여러 Django 앱 모듈, 서드파티 앱을 필요로 하며, 자체적으로 여러 앱을 정의합니다. Wagtail은 모듈식으로 구축되었으므로 필요에 맞게 많은 Wagtail 앱을 생략할 수 있습니다. 사용자 자신의 앱(여기서는 `myapp`)은 모델, 템플릿, 정적 자산, 템플릿 태그 및 사이트에 대한 기타 사용자 정의 기능을 정의하는 곳입니다. ### Wagtail 앱 **`wagtail`** `Page` 클래스, Wagtail 트리 및 모델 필드와 같은 Wagtail의 핵심 기능. **`wagtail.admin`** 페이지 편집 핸들러를 포함한 Wagtail의 관리 인터페이스. **`wagtail.documents`** Wagtail 문서 콘텐츠 유형. **`wagtail.snippets`** 비-페이지 모델 및 객체에 대한 편집 인터페이스. [](Snippets)를 참조하세요. **`wagtail.users`** 사용자 편집 인터페이스. **`wagtail.images`** Wagtail 이미지 콘텐츠 유형. **`wagtail.embeds`** Wagtail 리치 텍스트 필드의 oEmbed 및 Embedly 콘텐츠를 관리하는 모듈. **`wagtail.search`** 페이지 콘텐츠를 위한 검색 프레임워크. [](wagtailsearch)를 참조하세요. **`wagtail.sites`** Wagtail 사이트를 위한 관리 UI. **`wagtail.contrib.redirects`** 사이트에 임의의 리디렉션을 생성하기 위한 관리자 인터페이스. **`wagtail.contrib.forms`** 페이지에 양식을 만들고 제출물을 보기 위한 모델. [양식 빌더](form_builder)를 참조하세요. ### 서드파티 앱 **`taggit`** Django를 위한 태깅 프레임워크. 이것은 Wagtail 내부에서 이미지 및 문서 태깅에 사용되며 사용자 자신의 모델에서도 사용할 수 있습니다. Wagtail 모델 레시피는 [](tagging)을 참조하거나 [Taggit 문서](https://django-taggit.readthedocs.io/en/stable/)를 참조하세요. **`modelcluster`** Django ForeignKey 관계 기능의 확장으로, Wagtail 페이지에서 즉석 관련 객체 생성에 사용됩니다. 자세한 정보는 [](inline_panels) 또는 [django-modelcluster github 프로젝트 페이지](https://github.com/wagtail/django-modelcluster)를 참조하세요. ## URL 패턴 ```python from django.contrib import admin from wagtail import urls as wagtail_urls from wagtail.admin import urls as wagtailadmin_urls from wagtail.documents import urls as wagtaildocs_urls urlpatterns = [ path('django-admin/', admin.site.urls), path('admin/', include(wagtailadmin_urls)), path('documents/', include(wagtaildocs_urls)), # 자신의 바닐라 Django urls/views를 포함하기 위한 선택적 URL re_path(r'', include('myapp.urls')), # 위의 더 구체적인 규칙에 의해 잡히지 않은 모든 것을 # Wagtail의 서빙 메커니즘에 넘깁니다 re_path(r'', include(wagtail_urls)), ] ``` 프로젝트의 `urls.py` 에 대한 이 코드 블록은 몇 가지 작업을 수행합니다: - 바닐라 Django 관리자 인터페이스를 `/django-admin/` 에 로드합니다 - Wagtail 관리자와 다양한 앱을 로드합니다 - 자체 URL 구성이 필요한 Wagtail 이외의 바닐라 Django 앱을 디스패치합니다(Wagtail만 필요할 수 있으므로 이는 선택 사항입니다) - Wagtail이 추가 URL 디스패칭을 처리하도록 합니다. 이것이 프로젝트의 URL 구성에 포함하고 싶은 모든 것은 아니지만, Wagtail이 번창하는 데 필요한 것입니다. (complete_example_config)= ## 바로 사용할 수 있는 예제 구성 파일 이 두 파일은 프로젝트 디렉토리(`myproject/myproject/`)에 있어야 합니다. ### `settings.py` ```python import os PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = os.path.dirname(PROJECT_DIR) DEBUG = True # 애플리케이션 정의 INSTALLED_APPS = [ 'myapp', 'wagtail.contrib.forms', 'wagtail.contrib.redirects', 'wagtail.embeds', 'wagtail.sites', 'wagtail.users', 'wagtail.snippets', 'wagtail.documents', 'wagtail.images', 'wagtail.search', 'wagtail.admin', 'wagtail', 'taggit', 'modelcluster', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'wagtail.contrib.redirects.middleware.RedirectMiddleware', ] ROOT_URLCONF = 'myproject.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ os.path.join(PROJECT_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', ], }, }, ] WSGI_APPLICATION = 'myproject.wsgi.application' # 데이터베이스 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'myprojectdb', 'USER': 'postgres', 'PASSWORD': '', 'HOST': '', # localhost의 경우 빈 문자열로 설정하세요. 'PORT': '', # 기본값의 경우 빈 문자열로 설정하세요. 'CONN_MAX_AGE': 600, # 데이터베이스 연결이 지속되어야 하는 시간(초) } } # 국제화 LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # 정적 파일 (CSS, JavaScript, 이미지) STATICFILES_FINDERS = [ 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ] STATICFILES_DIRS = [ os.path.join(PROJECT_DIR, 'static'), ] STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATIC_URL = '/static/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/' ADMINS = [ # ('귀하의 이름', 'your_email@example.com'), ] MANAGERS = ADMINS # 기본적으로 더미 이메일 백엔드를 사용합니다. 개발/프로덕션/로컬 백엔드 구성 # https://docs.djangoproject.com/en/stable/topics/email/#email-backends 참조 EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend' # 이 사이트에 유효한 호스트/도메인 이름; DEBUG가 False인 경우 필수 ALLOWED_HOSTS = [] # 이것을 고유하게 만들고, 누구와도 공유하지 마세요. SECRET_KEY = 'change-me' EMAIL_SUBJECT_PREFIX = '[Wagtail] ' INTERNAL_IPS = ('127.0.0.1', '10.0.2.2') # 샘플 로깅 구성. 이 구성에 의해 수행되는 유일한 실질적인 로깅은 # DEBUG=False일 때 모든 HTTP 500 오류에 대해 사이트 관리자에게 이메일을 보내는 것입니다. # 로깅 구성을 사용자 정의하는 방법에 대한 자세한 내용은 # https://docs.djangoproject.com/en/stable/topics/logging을 참조하세요. LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse' } }, 'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler' } }, 'loggers': { 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': True, }, } } # WAGTAIL 설정 # 이것은 Wagtail 관리자에 로그인할 때 사용자를 환영하는 # Wagtail 설치의 사람이 읽을 수 있는 이름입니다. WAGTAIL_SITE_NAME = 'My Project' # 검색 백엔드 교체 #WAGTAILSEARCH_BACKENDS = { # 'default': { # 'BACKEND': 'wagtail.search.backends.elasticsearch8', # 'INDEX': 'myapp' # } #} # Wagtail 이메일 알림 발신 주소 # WAGTAILADMIN_NOTIFICATION_FROM_EMAIL = 'wagtail@myhost.io' # Wagtail 이메일 알림 형식 # WAGTAILADMIN_NOTIFICATION_USE_HTML = True # 문서 라이브러리의 문서에 허용되는 파일 확장자. # 모든 파일을 허용하려면 이를 생략할 수 있지만, 신뢰할 수 없는 사용자가 # 파일을 업로드할 수 있도록 허용하는 경우 보안 위험을 초래할 수 있습니다. # https://docs.wagtail.org/en/stable/advanced_topics/deploying.html#user-uploaded-files 참조 WAGTAILDOCS_EXTENSIONS = ['csv', 'docx', 'key', 'odt', 'pdf', 'pptx', 'rtf', 'txt', 'xlsx', 'zip'] # 기본 대소문자 구분 태그 처리를 반전 TAGGIT_CASE_INSENSITIVE = True ``` ### `urls.py` ```python from django.urls import include, path, re_path from django.conf.urls.static import static from django.views.generic.base import RedirectView from django.contrib import admin from django.conf import settings import os.path from wagtail import urls as wagtail_urls from wagtail.admin import urls as wagtailadmin_urls from wagtail.documents import urls as wagtaildocs_urls urlpatterns = [ path('django-admin/', admin.site.urls), path('admin/', include(wagtailadmin_urls)), path('documents/', include(wagtaildocs_urls)), # 위의 더 구체적인 규칙에 의해 잡히지 않은 모든 것을 # Wagtail의 서빙 메커니즘에 넘깁니다 re_path(r'', include(wagtail_urls)), ] if settings.DEBUG: from django.contrib.staticfiles.urls import staticfiles_urlpatterns urlpatterns += staticfiles_urlpatterns() # 개발 모드에서 gunicorn에 정적 파일이 어디에 있는지 알려줍니다 urlpatterns += static(settings.MEDIA_URL + 'images/', document_root=os.path.join(settings.MEDIA_ROOT, 'images')) urlpatterns += [ path('favicon.ico', RedirectView.as_view(url=settings.STATIC_URL + 'myapp/images/favicon.ico')) ] ```