Wagtail Admin Page에서 settings에 기능을 추가하는 방법에 대해서 다뤄보려고 한다. 

 

https://www.youtube.com/watch?v=jsan9SclzpI&list=PLMQHMcNi6ocsS8Bfnuy_IDgJ4bHRRrvub&index=14 

 

위 영상을 따라해서 만들었다. 

 

1. 새로운 App 생성

 

python manage.py startapp site_settings

Settings를 따로 관리하기 위해 App을 만들어준다. App을 만들었으니 base.py에 등록한다. 

 

settings/base.py

INSTALLED_APPS = [

    'site_settings',
]

apps.py와 models.py이외에는 필요가 없으니 나머지 views.py, admin.py, tests.py는 지워준다.(옵션 사항)

 

 

2. Model작성

 

site_settings/models.py

from django.db import models

from wagtail.admin.edit_handlers import FieldPanel, MultiFieldPanel
from wagtail.contrib.settings.models import BaseSetting, register_setting


@register_setting
class SocialMediaSettings(BaseSetting):
    """Social media settings for our custom website."""
    
    facebook = models.CharField(blank=True, null=True, help_text="Facebook URL", max_length=30)
    twitter = models.CharField(blank=True, null=True, help_text="Twitter URL", max_length=30)
    youtube = models.CharField(blank=True, null=True, help_text="YouTube URL", max_length=30)
    
    panels = [
        MultiFieldPanel([
            FieldPanel("facebook"),
            FieldPanel("twitter"),
            FieldPanel("youtube"),
        ], heading="Social Media Settings")
    ]

위와 같이 모델을 작성해준다. 튜토리얼과 같이 SocialMedia를 관리하는 Setting을 만드려고 한다. 모델 작성하는 방법은 기존 모델 작성하는 방법과 같다. 다만 BaseSetting을 상속받아 Setting 페이지 양식으로 작성하고 

데코레이터(=@)를 사용하여 settings에 등록해준다. 

 

 

3. 설정 파일 수정

마이그레이션을 진행하고 admin page를 확인해보면 적용이 안되어 있을 것이다. setting을 수정하기 위해서는 setting에 2가지를 추가해줘야한다. 

 

settings/base.py

INSTALLED_APPS = [
	...
    'wagtail.contrib.forms',
    'wagtail.contrib.redirects',
    'wagtail.contrib.settings', # 추가
]


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',
                'wagtail.contrib.settings.context_processors.settings', # 추가
            ],
        },
    },
]

1) INSTALLED_APPS에 'wagtail.contrib.settings'를 추가해준다. 

2) TEMPLATES에 wagtail.contrib.settings.context_processors.settings를 추가해준다. 

 

 

4. 적용 완료

 

정상적으로 적용된 것을 확인할 수 있다. Field에 각 사이트의 주소를 적어보자.

 

 

5. Templates에서 사용

home/home_page.html

    {% if settings.site_settings.SocialMediasettings.facebook %}
        <a href="{{ settings.site_settings.SocialMediaSettings.facebook }}">
            <i class="fab fa-facebook-f"></i>
        </a>
    {% endif %}
    {% if settings.site_settings.SocialMediasettings.twitter %}
        <a href="{{ settings.site_settings.SocialMediaSettings.twitter }}">
            <i class="fab fa-twitter"></i>
        </a>
    {% endif %}
    {% if settings.site_settings.SocialMediasettings.youtube %}
        <a href="{{ settings.site_settings.SocialMediaSettings.youtube }}">
            <i class="fab fa-youtube"></i>
        </a>
    {% endif %}

사용하는 방법은 settings.App 이름.클래스 이름.필드 이름으로 사용한다. 

'Back-End > Wagtail, Django' 카테고리의 다른 글

Wagtail git ignore setting  (0) 2021.11.16
Wagtail Routable Pages  (0) 2021.11.16
Wagtail Debug Toolbar(+ Django)  (0) 2021.11.13
Django, Wagtail Vue 로그인 연동  (0) 2021.11.12
Wagtail Rich Editor 기능 추가  (0) 2021.11.06

Django로 개발할 때 유용한 Tool인 Django Debug Toolbar를 설치하는 방법에 대해서 적어보려고 한다. 

문서의 내용은 Django에서 설치하는 방법이지만 현재 Wagtail을 사용하고 있기 때문에 Wagtail에서 사용하는 방법에 대해서 정리하려고 한다. 

 

Django에서 적용하고 싶은 사람은 공식 문서를 따라하면 될 것이다.

https://django-debug-toolbar.readthedocs.io/en/latest/installation.html

 

Installation — Django Debug Toolbar 3.2.2 documentation

Each of the following steps needs to be configured for the Debug Toolbar to be fully functional. Troubleshooting On some platforms, the Django runserver command may use incorrect content types for static assets. To guess content types, Django relies on the

django-debug-toolbar.readthedocs.io

 

 

1. Django Debug Toolbar 설치

python -m pip install django-debug-toolbar

 

 

2. Module 적용

wagtail settings에는 base.py, dev.py, production.py가 있다. 

 

1)base.py

This file is for global settings that will be used in both development and production. Aim to keep most of your configuration in this file.

 

2)dev.py

This file is for settings that will only be used by developers. For example: DEBUG = True

 

3)production.py

This file is for settings that will only run on a production server. For example: DEBUG = False

 

4)local.py

This file is used for settings local to a particular machine. This file should never be tracked by a version control system.

 

1) base.py 는 공통적으로 사용하는 것을 정의 해 놓는다.

2) dev.py에는 로컬 단계. 즉 개발할 때 사용하는 것을 정의 해 놓는다.

3) production.py는 배포 서버를 위해 사용하는 것을 정의한다.

4) local.py 특정 기기에서 사용할 것을 정의한다. 

 

my_project/settings/dev.py

INSTALLED_APPS = INSTALLED_APPS + [
    'debug_toolbar',
]

INTERNAL_IPS = [
    '127.0.0.1',
]

MIDDLEWARE = MIDDLEWARE + [
    'debug_toolbar.middleware.DebugToolbarMiddleware',
]

형식은 위와 같이 '+' 로 추가해준다고 적어주면 된다. 

 

INTERNAL_IPS는 로컬에서만 Debug Toolbar를 사용할 것이기 때문에 로컬 주소를 적어준다. 

 

MIDDLEWARE도 마찬가지로 dev.py에서 추가로 관리할 수 있다. 

 

 

3. URL 설정

my_project/urls.py

if settings.DEBUG:
    from django.conf.urls.static import static
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns

    # Serve static and media files from development server
    urlpatterns += staticfiles_urlpatterns()
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
    import debug_toolbar
    
    urlpatterns = urlpatterns + [
        path('__debug__/', include(debug_toolbar.urls)),
    ]

Debug 세팅을 위해 위와 같이 수정해준다. 역시나 마찬가지로 추가적인 설정이 있으면 '+'를 통해 종류별로 구별해서 정리할 수 있다. 

 

'__debug__'는 debug toolbar의 주소이다. (다른 App이랑 충돌이 안나는 선에서 아무거나 입력해도 된다. debug_toobar.urls만 명시해주면 된다. )

 

 

 

 

4. 적용 확인

python manage.py runserver

서버를 실행하고 웹 페이지에 들어가보면 적용이 되어 있는 것을 확인할 수 있다. Debug Toolbar를 통해 개발하는데 구체적인 정보를 얻을 수 있다. 

'Back-End > Wagtail, Django' 카테고리의 다른 글

Wagtail Routable Pages  (0) 2021.11.16
Wagtail BaseSetting  (0) 2021.11.15
Django, Wagtail Vue 로그인 연동  (0) 2021.11.12
Wagtail Rich Editor 기능 추가  (0) 2021.11.06
Wagtail Admin Page 한글 설정  (0) 2021.11.04

https://ichi.pro/ko/django-rest-framework-mich-nuxt-autheseo-google-sosyeol-logeu-in-eul-bildeuhago-jwt-tokeun-eul-saelo-gochineun-bangbeob--128806100117235

 

Django Rest Framework 및 Nuxt Auth에서 Google 소셜 로그인을 빌드하고 JWT 토큰을 새로 고치는 방법 1 부

Nuxt 및 Django에서 종단 간 소셜 로그인 화면 구축 개요 지난 몇 주 동안 저는 사이드 프로젝트를 진행해 왔습니다. 요구 사항 중 하나는 사용자가 Google 소셜 로그인을 사용하여 애플리케이션에 로

ichi.pro

Django와 Vue의 Social Login을 연동하는 방법이다. Wagtail은 Django 기반이기 때문에 사용방법이 동일하다. (다만 Wagtail에서는 views.py를 사용하지 않기 때문에 일부 수정이 필요하다.)

 

1. Nuxt App Build

튜토리얼대로 진행해보겠다. 

 

환경은 python 3.8로 진행했다. 필요 module은 진행하면서 설치할 계획이다.

 

1) 먼저 project 폴더를 생성해주자.

mkdir google-login
cd google-login

2) front라는 이름의 vue 프로젝트를 생성해주자. 

npm init nuxt-app frontend

3) 아래와 같이 설정을 진행하면 된다. 

? Project name: google-login
? Programming language: JavaScript
? Package manager: Npm
? UI framework: Buefy
? Nuxt.js modules: enter를 눌러주자
? Linting tools: enter를 눌러주자
? Testing framework: None
? Rendering mode: Universal (SSR / SSG)
? Deployment target: Static (Static/JAMStack hosting)
? Development tools: enter를 눌러주자
? What is your GitHub username? sdil
? Version control system: Git

Vue에 대해서 자세하게 다루는 글이 아니기 때문에 세부설정에 대한 설명은 하지 않겠다. 

 

4) nuxt auth와 axios를 설치해주자.

cd frontend
npm install --save-exact @nuxtjs/auth-next
npm install @nuxtjs/auth-next @nuxtjs/axios

5) nuxt.config.js 수정

frontend/nuxt.config.js

  modules: [
    // https://go.nuxtjs.dev/buefy
    'nuxt-buefy',
    '@nuxtjs/axios',
    '@nuxtjs/auth-next',
  ],
  auth: {
    strategies: {
      google: {
        clientId: 'to be added'
      }
    }
  },

위와 같이 설정을 바꿔주자. 

 

6) login.vue 작성

frontend/pages/login.vue

<template>
  <section class="section">
    <b-button @click="loginWithGoogle()" icon-left="google">
      Sign in with Google
    </b-button>
  </section>
</template>

<script>
export default {
  methods: {
    loginWithGoogle() {
      this.$auth.loginWith("google");
    },
  },
};
</script>

Social Login을 위한 Google로그인 버튼을 생성했다. 

 

7) protect.vue 작성

frontend/pages/protected.vue

<template>
  <section class="section">
      {{ $auth.user.email }}
  </section>
</template>

<script>
export default {
  middleware: 'auth'
};
</script>

Nuxt Auth 미들웨어를 활성화 했다. 사용자가 로그인했을 때만 Page에 Access 할 수가 있다. 로그인 하지 않으면 사용자가 로그인 페이지로 Redirection 된다. 

 

8) 작동 Test

nuxt dev

# 문제가 발생하는 경우에는 npm install nuxt -g

9) localhost:3000/login 이동

login 버튼을 생성해 놓은 login page로 이동해서 google login 버튼을 누르면 400 승인 오류가 발생할 것이다. 걱정할 필요 없다. 아직 Google OAuth 설정을 하지 않았기 때문이다. 

 

2. Wagtail API 서버 구축

1) wagtail 설치, 프로젝트 생성

cd ../
pip install wagtail
wagtail start backend
cd backend

backend라는 Wagtail project를 생성해주었다. 

 

2) 필요 모듈 설치

pip install django-rest-framework dj-rest-auth django-allauth django-cors-headers
pip install djangorestframework-simplejwt

3) App 생성

python manage.py startapp social_login

4) views.py 수정

Wagtail에서는 views.py을 사용하지 않으므로 이후 수정이 필요하다고 생각된다. 허나 지금은 튜토리얼대로 그대로 따라해볼 생각이다.

backend/social_login/views.py

from allauth.socialaccount.providers.google.views import GoogleOAuth2Adapter
from dj_rest_auth.registration.views import SocialLoginView
from allauth.socialaccount.providers.oauth2.client import OAuth2Client
from django.conf import settings

class GoogleLogin(SocialLoginView):
    authentication_classes = [] # disable authentication
    adapter_class = GoogleOAuth2Adapter
    callback_url = "http://localhost:3000/login"
    client_class = OAuth2Client

5) urls.py 수정

backend/backend/urls.py

from django.contrib import admin
from django.urls import path, include
from social_login.views import GoogleLogin

urlpatterns = [
    path('admin/', admin.site.urls),
    path('auth/', include('dj_rest_auth.urls')),
    path('social-login/google/', GoogleLogin.as_view(), name='google_login'),
]

6) settings/base.py 수정

backend/settings/base.py

INSTALLED_APPS = [
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     "social_login",
     "rest_framework",
     "rest_framework.authtoken",
     "corsheaders",
     "django.contrib.sites",
     # Auth & social auth
     "dj_rest_auth",
     "allauth",
     "allauth.account",
     "dj_rest_auth.registration",
     "allauth.socialaccount",
     "allauth.socialaccount.providers.google",
 ]
 
SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'SCOPE': [
            'profile',
            'email',
        ],
        'AUTH_PARAMS': {
            'access_type': 'online',
        }
    }
}

# Disable email verification since this is just a test.
# If you want to enable it, you'll need to configure django-allauth's email confirmation pages
SOCIALACCOUNT_EMAIL_VERIFICATION = "none"
SOCIALACCOUNT_EMAIL_REQUIRED = False

REST_USE_JWT = True

SITE_ID = 1

from datetime import timedelta

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    'ROTATE_REFRESH_TOKENS': True, # IMPORTANT
    'BLACKLIST_AFTER_ROTATION': True, # IMPORTANT
    'UPDATE_LAST_LOGIN': True,
}

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    'django.middleware.security.SecurityMiddleware',
    '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',
]

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

# Rest Settings
REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAuthenticated",),
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework.authentication.BasicAuthentication",
        "rest_framework.authentication.SessionAuthentication",
        "dj_rest_auth.utils.JWTCookieAuthentication",
    ),
}

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

7) migrations 실행

python manage.py makemigrations
python manage.py migrate

3. Google OAuth 설정

1) Google Cloud Platform 접속

https://console.cloud.google.com/apis/dashboard

위 사이트로 이동하자. 

 

2) OAuth 설정

이후 외부를 클릭한 뒤, 앱 이름, 이메일을 입력하고 저장하기를 누른다. 

동의가 완료 되었으면 사용자 인증 정보를 클릭한다. 

OAuth 클라이언트 ID를 클릭하고 애플리케이션 유형을 웹 애플리케이션으로 설정한다. (이름은 알아서 설정)

URI 설정은 다음과 같이 하고 저장을 누른다. 

 

 

그러면 자신의 클라이언트 ID와 비밀번호가 나올 것이다. 메모장에다가 저장해놓자. 

 

 

4. Nuxt 앱에 Google 클라이언트 ID 추가

클라이언트 ID 추가

frontend/nuxt.config.js

  auth: {
    strategies: {
      google: {
        clientId: '클라이언트 ID',
        codeChallengeMethod: '',
        responseType: 'code',
        endpoints: {
          token: 'http://localhost:8000/social-login/google/',
          userInfo: 'http://localhost:8000/auth/user/'
        },
      },
    }
  },

클라이언트 ID는 아까 google에서 생성한 클라이언트 ID를 넣으면 된다. 

 

 

5. Django 앱에 Google 클라이언트 ID 및 비밀번호 추가

1) create superuser 

cd backend
python manage.py createsuperuser
Username (leave blank to use 'fadhil'): admin
Email address: admin@test.com
Password: 
Password (again): 
Superuser created successfully.

슈퍼 유저를 생성해주자. 

 

2) django-admin 페이지 접속

localhost:8000/django-admin으로 접속한다. 

로그인을 한 뒤 

다음과 같이 설정을 진행해준다. 

이제 완료되었다. 로그인을 진행한 뒤 wagtail admin으로 들어가보면 user가 등록되어 있을 것이다. 

 

'Back-End > Wagtail, Django' 카테고리의 다른 글

Wagtail BaseSetting  (0) 2021.11.15
Wagtail Debug Toolbar(+ Django)  (0) 2021.11.13
Wagtail Rich Editor 기능 추가  (0) 2021.11.06
Wagtail Admin Page 한글 설정  (0) 2021.11.04
Wagtail Form  (0) 2021.11.02

간단하게 Wagtail 에서 제공하는 RichEditor를 수정해보려고 한다. 

Draftail로 새로운 기능을 만들어서 적용하는 방법도 있지만 일단은 기본 RichEditor에 기능을 추가하는 것만 적어보려고한다.

 

https://docs.wagtail.io/en/stable/advanced_topics/customisation/page_editing_interface.html#rich-text-features

 

1. 모든 RichTextEditor 수정

settings/base.py

WAGTAILADMIN_RICH_TEXT_EDITORS = {
    'default': {
        'WIDGET': 'wagtail.admin.rich_text.DraftailRichTextArea',
        'OPTIONS': {
            'features': [
                'h2', 'bold', 'italic', 'link', 'document-link', 
                'code', 'image', 'embed', 'ol', 'ul'
                ]
        }
    },
    'legacy': {
        'WIDGET': 'wagtail.admin.rich_text.HalloRichTextArea',
    }
}

base.py에서 RichEditor의 features를 정할 수 있다. 

  • h1, h2, h3, h4, h5, h6 - heading elements
  • bold, italic - bold / italic text
  • ol, ul - ordered / unordered lists
  • hr - horizontal rules
  • link - page, external and email links
  • document-link - links to documents
  • image - embedded images
  • embed - embedded media (see Embedded content)
  • code - inline code
  • superscript, subscript, strikethrough - text formatting
  • blockquote - blockquote

RichEditor에서 제공하는 기능들이다. 이외 필요한 기능이 있다면 직접 만들어서 쓰면 된다. 

관련 기능에 대한 정리는 https://vicapor.tistory.com/55 에서 확인이 가능하다. 

 

 

2. 한개만 적용

banner_subtitle = RichTextField(features=["bold", "italic"], null=True)

특정한 필드만 적용하고 싶을 때는 위와 같이 해주면 된다. 

 

 

추가) 옛날 Editor 적용

그리고 legacy는 RichEditor 옛날 버전이라고 보면 된다. 

적용방법은

body = RichTextField(editor='legacy')

처럼 해주면 된다. 

 

https://docs.wagtail.io/en/stable/reference/settings.html#id15

'Back-End > Wagtail, Django' 카테고리의 다른 글

Wagtail Debug Toolbar(+ Django)  (0) 2021.11.13
Django, Wagtail Vue 로그인 연동  (0) 2021.11.12
Wagtail Admin Page 한글 설정  (0) 2021.11.04
Wagtail Form  (0) 2021.11.02
Wagtail Ajax  (0) 2021.10.29

Wagtail에서 한글을 지원한다. 설정 방법이 간단하니깐 한글로 설정을 진행해보자.

 

변경 방법

왼쪽 하단 아이디를 클릭하고 Account settings를 클릭한다. 그리고 Account Page에서 Preferred language를 한국어로 바꾼다. Current time zone은 옵션이지만 이것도 Asia/Seoul로 찾아서 바꿔주자.

변경 후

관리자 페이지에 한글이 적용된 것을 확인 할 수 있다. 

'Back-End > Wagtail, Django' 카테고리의 다른 글

Django, Wagtail Vue 로그인 연동  (0) 2021.11.12
Wagtail Rich Editor 기능 추가  (0) 2021.11.06
Wagtail Form  (0) 2021.11.02
Wagtail Ajax  (0) 2021.10.29
Wagtail Custom Admin Menu  (0) 2021.10.28

https://www.accordbox.com/blog/how-build-form-page-wagtail/

 

Wagtail에서 Form을 적용하는 방법에 대해서 알아보자. 

Wagtail에서는 이미 Form 생성 툴을 제공한다. 

 

1. Form 페이지 생성

forms/models.py

from wagtail.contrib.forms.models import AbstractEmailForm, AbstractFormField

class FormField(AbstractFormField):
    page = ParentalKey('FormPage', related_name='custom_form_fields')


class FormPage(AbstractEmailForm):
    thank_you_text = RichTextField(blank=True)

    content_panels = AbstractEmailForm.content_panels + [
        InlinePanel('custom_form_fields', label="Form fields"),
        FieldPanel('thank_you_text', classname="full"),
        MultiFieldPanel([
            FieldRowPanel([
                FieldPanel('from_address', classname="col6"),
                FieldPanel('to_address', classname="col6"),
            ]),
            FieldPanel('subject'),
        ], "Email Notification Config"),
    ]

    def get_form_fields(self):
        return self.custom_form_fields.all()

AbstractFormField는 wagtail에서 제공하는 Form Builder이다. 사용자가 Form을 전송하고 나서 보여지는 메세지을 thank_you_text 필드에 저장한다. from_address하고 to_address는 사용자가 form을 작성하고 submit을 눌렀을 때, to_address에 있는 메일 주소로 메일을 보내게 할 수 있다. 나는 현재 만드는 Form에서는 쓰지 않지만 사용할 일이 있을 수도 있으니 일단 적어놨다. 

 

settings/dev.py에 다음을 추가하자 (이미 기본적으로 추가되어 있을 것이다.)

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

 

Form Type에는 여러가지 Form을 선택할 수 있고 Form들을 조합해서 새로운 Form 양식을 만들어 낼 수 있다. 

 

2. 템플릿 작성

 

템플릿에서 표현하기 위해 다음 모듈을 설치해주자.

pip install django-widget-tweaks

django-widget-tweaks는 파이썬 수준의 폼 정의가 아닌 템플릿의 폼 필드 렌더링을 조정한다. CSS 클래스 및 HTML 속성 변경을 지원한다. 즉 우리가 Form을 원하는대로 Custom 할 수 있게 해준다.

 

user_management/form_page.html

{% extends "base.html" %}
{% load static wagtailcore_tags widget_tweaks %}

{% block content %}

<h1>Contact</h1>
<br>

<form action="{% pageurl page %}" method="POST">
    {% csrf_token %}

    {% if form.non_field_errors %}
    <div class="alert alert-danger" role="alert">
        {% for error in form.non_field_errors %}
            {{ error }}
        {% endfor %}
    </div>
    {% endif %}

    {% for field in form.visible_fields %}
        <div class="form-group">
            {{ field.label_tag }}
            {% render_field field class+="form-control" %}
        </div>
    {% endfor %}

    <button type="submit" class="btn btn-primary" >Submit</button>
</form>

{% endblock %}

Form Page 템플릿이다. 여기서 우리가 Admin Page에서 만든 Form Page양식이 보여진다. 그리고 submit을 하면 정상적으로 제출되었다고 알려줄 수 있게 landing page를 추가하자. 

 

user_management.py/form_page_landing.html

{% extends "blog/base.html" %}

{% load static wagtailcore_tags  wagtailimages_tags el_pagination_tags menu_tags %}

{% block content %}

<h2>{{ page.thank_you_text | richtext }}</h2>

{% endblock %}

모델에서 작성한 tank_you_text 필드가 보여질 것이다. Form Page에서 정상적으로 제출된 Form들은 Wagtail Admin Page에 Forms에 저장되어 있을 것이다.

 

추가) Form Custom

 

기본 Form 작성법을 알았으니 추가적으로 Custom 하는 방법에 대해서 알아보자

https://docs.wagtail.io/en/stable/reference/contrib/forms/customisation.html

 

1. custom field 추가 

forms/models.py

from django import forms
from django.db import models
from modelcluster.fields import ParentalKey
from wagtail.contrib.forms.forms import FormBuilder
from wagtail.contrib.forms.models import (
  AbstractEmailForm, AbstractFormField, FORM_FIELD_CHOICES)


class FormField(AbstractFormField):
    # extend the built in field type choices
    # our field type key will be 'ipaddress'
    CHOICES = FORM_FIELD_CHOICES + (('ipaddress', 'IP Address'),)

    page = ParentalKey('FormPage', related_name='form_fields')
    # override the field_type field with extended choices
    field_type = models.CharField(
        verbose_name='field type',
        max_length=16,
        # use the choices tuple defined above
        choices=CHOICES
    )


class CustomFormBuilder(FormBuilder):
    # create a function that returns an instanced Django form field
    # function name must match create_<field_type_key>_field
    def create_ipaddress_field(self, field, options):
        # return `forms.GenericIPAddressField(**options)` not `forms.SlugField`
        # returns created a form field with the options passed in
        return forms.GenericIPAddressField(**options)


class FormPage(AbstractEmailForm):
    # intro, thank_you_text, edit_handlers, etc...

    # use custom form builder defined above
    form_builder = CustomFormBuilder

FormField정의하고 Form type 리스트에 추가하고 CustomFormBuilder에 추가해주면 된다. 

field type에 리스트로 저장될 새로운 field이름은 튜플형태로 작성해주면 된다. 

('ipaddress', 'IP Address') 에서 앞쪽이 리스트에 표시될 이름이다.

 

2. render page 수정

기본적으로 form을 제출하고 나면 form_page_landing.html로 redirect된다. 특정 page로 가고 싶을때는 다음과 같이 작성하면된다. 

 

forms/models.py

    def render_landing_page(self, request, form_submission=None, *args, **kwargs):
        if self.thank_you_page:
            url = self.thank_you_page.url
            # if a form_submission instance is available, append the id to URL
            # when previewing landing page, there will not be a form_submission instance
            if form_submission:
              url += '?id=%s' % form_submission.id
            return redirect(url, permanent=False)
        # if no thank_you_page is set, render default landing page
        return super().render_landing_page(request, form_submission, *args, **kwargs)

FormPage에 추가해주면 된다. 특정 url로 가고 싶다면 다음과 같이 작성하면 된다. 

    def render_landing_page(self, request, form_submission=None, *args, **kwargs):
        url = #원하는 주소

        return redirect(url, permanent=False)

 

'Back-End > Wagtail, Django' 카테고리의 다른 글

Wagtail Rich Editor 기능 추가  (0) 2021.11.06
Wagtail Admin Page 한글 설정  (0) 2021.11.04
Wagtail Ajax  (0) 2021.10.29
Wagtail Custom Admin Menu  (0) 2021.10.28
Wagtail StreamField Queryset  (0) 2021.10.27

+ Recent posts