目的
Djangoで会員制のWebサイトを作ったとき、会員登録めんどくさいから SNSのアカウントでログインしたい、
といったときの選択肢として django-allauth は重要。
しかし デフォルトのテンプレートは 見た目がイケてない。
そこでテンプレートを差し替える方法まとめ。
allauth も Django で作られた Webサイト
allauth
というのは 認証のためのパッケージのような何かと思うのではなく、
Django で Web サイト作ろうとしている あなた と同じように、 Raymond Penners が Django で作った Webサイト だと思ってほしい
テンプレートを見ろ
📖 django-allauth/allauth/templates/account
👆 テンプレートが置いてあることを確認してほしい。 allauth では templates/account
ディレクトリーに テンプレートを置いているようだ
こんな記事を読む人間は、この HTML がダサいから Vuetify に置き換えたい、といったところだろう
テンプレートをコピーしろ
👇ここで、今あなたが作ろうとしている Webサイト のソースが入っているディレクトリーの名前を仮に webapp1
だとしよう
└── 📂host1
└── 📂webapp1 # アプリケーション フォルダー
👇すると、あなたの Webサイト のテンプレートは例えば 以下のように置いているはずだ
└── 📂host1
└── 📂webapp1 # アプリケーション フォルダー
└── 📂templates
└── 📂webapp1 # アプリケーション フォルダー と同じ名前
└── 📄page1.html
👇自分の Webサイトに、 allauth のテンプレートを合体させたければ、以下のように置けばよい
└── 📂host1
└── 📂webapp1 # アプリケーション フォルダー
└── 📂templates
├── 📂allauth-customized # 別のアプリケーションからコピーしたことが分かる名前を付ける
│ └── 📂v1 # バージョンが更新される悲劇に備える
│ └── 📂account # このフォルダーは django-allauth が使ってる名前と同じにする
│ ├── 📄login.html
│ ├── 📄logout.html
│ ├── ...中略...
│ └── 📄<いろいろ>.html
└── 📂webapp1 # アプリケーション フォルダー と同じ名前
└── 📄page1.html
allauth から コピーしてくるテンプレート(.html)は、見た目を替えたいファイルだけでよい
HTMLを編集しろ
このとき、 host1/webapp1/templates/allauth-customized/v1/account/login.html
ファイルの
<h1>{% trans "Sign In" %}</h1>
のような部分を、
<h1>{% trans "Sign In" %}(^q^)</h1>
のように変えておくことで、 allauth の account/login.html
ではなく、 コピーした方の login.html が使われていることを目視確認できるようにしておく
URLを引っ張ってこい
👇 urls.py
に何を書けばいいのかだが
└── 📂host1
└── 📂webapp1 # アプリケーション フォルダー
├── 📂templates
│ ├── 📂allauth-customized # 別のアプリケーションからコピーしたことが分かる名前を付ける
│ │ └── 📂v1 # バージョンが更新される悲劇に備える
│ │ └── 📂account # このフォルダーは django-allauth が使ってる名前と同じにする
│ │ ├── 📄login.html
│ │ ├── 📄logout.html
│ │ ├── ...中略...
│ │ └── 📄<いろいろ>.html
│ └── 📂webapp1 # アプリケーション フォルダー と同じ名前
│ └── 📄page1.html
👉 └── 📄urls.py
👇 抜粋すると、以下のように書く
from django.urls import include, path
urlpatterns = [
# ...中略...
# allauth の URLのパスのコピー
path('accounts/v1/', include('allauth.urls')),
# ------------ -----------------------
# 1
# 1. 例えば `http://example.com/accounts/v1/` のような URLのパスの部分
# 2. allauth の例えば `login/` のようなパスを 1. のパスにぶら下げる形で全てコピーします
]
アクセスしろ
ローカルホストに Webサイト が起ちあがっているなら、以下の URL で allauth のログイン画面にアクセスできるはずだ
- サインアップ http://localhost:8000/accounts/v1/signup/
- ログイン http://localhost:8000/accounts/v1/login/
- ログアウト http://localhost:8000/accounts/v1/logout/ - ホームに戻ります
allauth にはどんな URL、どんなテンプレート があるか?
まず urls.py を見ろ
📖 django-allauth/allauth/account/urls.py
Num | Name | Path | View object |
---|---|---|---|
1 | account_signup | signup/ |
views.signup |
2 | account_login | login/ |
views.login |
3 | account_logout | logout/ |
views.logout |
4 | account_change_password | password/change/ |
views.password_change |
5 | account_set_password | password/set/ |
views.password_set |
6 | account_inactive | inactive/ |
views.account_inactive |
7 | account_email | email/ |
views.email |
8 | account_email_verification_sent | confirm-email/ |
views.email_verification_sent |
9 | account_confirm_email | r"^confirm-email/(?P<key>[-:\w]+)/$" |
views.confirm_email |
10 | account_reset_password | password/reset/ |
views.password_reset |
11 | account_reset_password_done | password/reset/done/ |
views.password_reset_done |
12 | account_reset_password_from_key | r"^password/reset/key/(?P<uidb36>[0-9A-Za-z]+)-(?P<key>.+)/$" |
views.password_reset_from_key |
13 | account_reset_password_from_key_done | password/reset/key/done/ |
views.password_reset_from_key_done |
👆 URLにアクセスすれば、 URLの形に合った、Viewオブジェクトの get なり post なりのメソッドが呼び出される仕組みだ
次に views.py を見ろ
📖 django-allauth/allauth/account/views.py
Num | Create instance | Class |
---|---|---|
1 | signup = SignupView.as_view() | SignupView |
2 | login = LoginView.as_view() | LoginView |
3 | logout = LogoutView.as_view() | LogoutView |
4 | password_change = login_required(PasswordChangeView.as_view()) | PasswordChangeView |
5 | password_set = login_required(PasswordSetView.as_view()) | PasswordSetView |
6 | account_inactive = AccountInactiveView.as_view() | AccountInactiveView |
7 | email = login_required(EmailView.as_view()) | EmailView |
8 | email_verification_sent = EmailVerificationSentView.as_view() | EmailVerificationSentView |
9 | confirm_email = ConfirmEmailView.as_view() | ConfirmEmailView |
10 | password_reset = PasswordResetView.as_view() | PasswordResetView |
11 | password_reset_done = PasswordResetDoneView.as_view() | PasswordResetDoneView |
12 | password_reset_from_key = PasswordResetFromKeyView.as_view() | PasswordResetFromKeyView |
13 | password_reset_from_key_done = PasswordResetFromKeyDoneView.as_view() | PasswordResetFromKeyDoneView |
👆 URL に対応する クラス名までは分かった
テンプレート名を見ろ
以上のクラスは template_name
プロパティを持っている
Num | Class | template_name |
---|---|---|
1 | SignupView | "account/signup." + app_settings.TEMPLATE_EXTENSION |
2 | LoginView | "account/login." + app_settings.TEMPLATE_EXTENSION |
3 | LogoutView | "account/logout." + app_settings.TEMPLATE_EXTENSION |
4 | PasswordChangeView | "account/password_change." + app_settings.TEMPLATE_EXTENSION |
5 | PasswordSetView | "account/password_set." + app_settings.TEMPLATE_EXTENSION |
6 | AccountInactiveView | "account/account_inactive." + app_settings.TEMPLATE_EXTENSION |
7 | EmailView | "account/email_confirm." + app_settings.TEMPLATE_EXTENSION |
8 | EmailVerificationSentView | "account/verification_sent." + app_settings.TEMPLATE_EXTENSION |
9 | ConfirmEmailView | "account/email_confirm." + app_settings.TEMPLATE_EXTENSION |
10 | PasswordResetView | "account/password_reset." + app_settings.TEMPLATE_EXTENSION |
11 | PasswordResetDoneView | "account/password_reset_done." + app_settings.TEMPLATE_EXTENSION |
12 | PasswordResetFromKeyView | "account/password_reset_from_key." + app_settings.TEMPLATE_EXTENSION |
13 | PasswordResetFromKeyDoneView | "account/password_reset_from_key_done." + app_settings.TEMPLATE_EXTENSION |
👆template_name プロパティを見れば、HTML(のようなもの)のファイルがどこに格納されているか当たりが付く
関連する記事
📖 django-allauthのテンプレートファイルをカスタマイズする手順
📖 Django-allauthでテンプレートを上書きするには、account配下にテンプレートを作成する