「django-registration-redux」を使ってみた

参照

django-registration-redux:Quick start guide

youtube

これかなり参考になりました
Try Django 1.8 Tutorial - 27 of 42 - Django Registration Redux - Learn Django

備考

django で user 登録, 認証をやるならいくつか選択肢があることがわかった。
django-regitration と django-registration-redux とあってどっちを使えばよいのか迷った。
SNSと連携するなら django-allauth が良さそうだった。

setup

install

1
$ pip install django-registration-redux

settings.pyregistration, django.contrib.sitesを追加

1
2
3
4
5
6
7
8
9
10
INSTALLED_APPS = [
'registration',
'django.contrib.sites',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

settings.pyに定数(設定値)を追加

1
2
3
4
5
6
7
ACCOUNT_ACTIVATION_DAYS = 3 # One-week activation window; you may, of course, use a different value.
REGISTRATION_AUTO_LOGIN = True # Automatically log the user in.
REGISTRATION_DEFAULT_FROM_EMAIL = 'test.example@ikasumimi.com'
REGISTRATION_EMAIL_HTML = False
ACCOUNT_AUTHENTICATED_REGISTRATION_REDIRECTS = True
REGISTRATION_USE_SITE_EMAIL = True
REGISTRATION_SITE_USER_EMAIL = True

django-registration-redux ではいくつかのユーザー登録・認証のフローを選択できるようだ。

ノーマルなのがThe default backendになる。
登録して、アクティベート用のメールが送られてくるタイプのものだ。
他には  
The “simple” (one-step) backend backend)
The admin approval backend
がある。  

project/urls.py のセットアップ

url(r'^accounts/', include('registration.backends.default.urls')),urlpatterns に追加

1
2
urlpatterns = [
url(r'^accounts/', include('registration.backends.default.urls')),

template のセットアップ

  1. templates dir の指定をしておく
    project/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',
    ],
    },
    },
    ]

project root に templates/registration dir を作成したのち,

macdhuibh/django-registration-templates をclone してtemplateファイルをコピーする.

というか、  
django-registration/registration/templates/registration/ 本家にありました
どっちが新しいのだろうか..

ユーザー登録を試してみる

http://127.0.0.1:8000/accounts/register/ にアクセスすると、ユーザー登録画面が見える
適当に入力して登録しようとするとエラー(ConnectionRefusedError at /accounts/register/)になる。
これはdjangoのローカルサーバだと、メール送信できないためである。
http://127.0.0.1:8000/admin/ 
で Registration profiles の データを確認(change:編集)すると、Activation Key:を確認することができる。
メールだと、下記の様なURLを送られてくるので、ローカル環境では下記の様なURLを人為的に作成して、試してみるとよい
http://127.0.0.1:8000/accounts/activate/{Activation Key}
成功すると、auth_userテーブルのis_activeの値が1になり
http://127.0.0.1:8000/accounts/activate/complete/ の画面が表示される .

アカウント登録時のフォームの入力フィールドを追加するには?

デフオルトだと、Username, E-mail, Password となっている
他に付け足したい場合は、CustomFormを作成してsettings.pyに明記する必要がある

accounts/forms.py を作成
UserRegistrationForm という名前の CustomForm を作成します

1
2
3
4
5
6
7
8
9
10
from django import forms
from django.utils.translation import ugettext_lazy as _
from registration.forms import RegistrationForm
from registration.forms import RegistrationFormTermsOfService
from registration.forms import RegistrationFormUniqueEmail

class UserRegistrationForm(RegistrationFormTermsOfService, RegistrationFormUniqueEmail):
first_name = forms.CharField(max_length=30, label=_("First name"))
last_name = forms.CharField(max_length=30, label=_("Last name"))
extra = forms.CharField(max_length=30, label=_("カスタムの入力項目"))

settings.py に CustomForm を指定

1
REGISTRATION_FORM = 'accounts.forms.UserRegistrationForm'

上の設定をすると、利用規約同意の項目を追加できたり、カスタムの入力項目を追加できたりします。  
ただ、この時点ではいくつかの問題があります。 カスタムの入力フィールどに対応したDBテーブルのカラムがないこと。
入力フィールドの見た目の調整が必要なこと。

https://stackoverflow.com/questions/42589634/why-django-registration-redux-custom-form-field-not-showing-up-in-the-form?rq=1

Model のカスタマイズ

Registration viewsのカスタマイズ

viewをカスタマイズする前に下記を熟読しておくことをオススメする。  
Djangoにおけるクラスベース汎用ビューの入門と使い方サンプル
django-registration-reduxでは[class-based views][https://docs.djangoproject.com/en/dev/topics/class-based-views/]を活用しているからだ

mainapp.urls.py

下記と
https://stackoverflow.com/questions/35741212/django-registration-redux-with-custom-user-model-registration-notimplementederro

メモ

DjangoのForm(CreateView、UpdateViewなど)について

https://www.youtube.com/watch?v=IH_l7UWk8WY

https://www.youtube.com/watch?v=CNtHjPpUKt8

registration.views.RegistrationView

1
2
3
4
5
6
from django.urls import include, path
from django.conf.urls import url
from django.contrib import admin
from django.views.generic.base import TemplateView
from registration.backends.default.views import ActivationView
from registration.backends.default.views import RegistrationView