用户系统 — 注册、登录、登出 → ユーザーシステム — 登録、ログイン、ログアウト
この章では、Django 組み込みの認証システムを使って、ユーザー登録・ログイン・ログアウト機能を実装します。
Django 内置 auth 系统 → Django 組み込み auth システム
Django には完全なユーザー認証モジュールが標準で用意されています:
- 内置
→ 組み込み
User模型(用户名、密码、邮箱等) → モデル(ユーザー名、パスワード、メールアドレスなど) - 内置登录/登出视图(无需自己写逻辑) → 組み込みのログイン/ログアウトビュー(自分でロジックを書く必要なし)
- 組み込みの権限とグループ管理
- フォーム検証とセキュリティ対策(CSRF、XSS)
このモジュールはdjango.contrib.authプロジェクト作成時にデフォルトで INSTALLED_APPS に登録されています。
注册页面 → 登録ページ
Django にはログイン/ログアウトビューは組み込まれていますが、登録ビューは組み込まれていないため、自分で作成する必要があります。
第一步:创建注册表单 → ステップ1:登録フォームを作成する
例
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class RegisterForm(UserCreationForm):
"""自定义注册表单:继承 UserCreationForm,添加邮箱字段""" → """カスタム登録フォーム:UserCreationForm を継承し、メールアドレスフィールドを追加"""
email = forms.EmailField(
label='邮箱' → 'メールアドレス',
required=True,
help_text=有効なメールアドレスを入力してください。
)
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
labels = {
'username': '用户名' → 'ユーザー名',
}
第二步:编写注册视图 → ステップ2:登録ビューを書く
例
from django.shortcuts import render, redirect
from django.contrib.auth import login
from django.contrib import messages
from .forms import RegisterForm
def register(request):
"""用户注册视图""" → """ユーザー登録ビュー"""
# 如果用户已登录,直接跳转首页 → # ユーザーがすでにログインしている場合は、そのままホームページへリダイレクト
if request.user.is_authenticated:
return redirect('index')
if request.method == 'POST':
# ユーザーが登録フォームを送信した → # ユーザーが登録フォームを送信した
form = RegisterForm(request.POST)
if form.is_valid():
user = form.save() # 保存用户到数据库 → # ユーザーをデータベースに保存
login(request, user) # 注册后自动登录 → # 登録後に自動ログイン
messages.success(request, f'注册成功,欢迎你,{user.username}!' → '登録成功、ようこそ、{user.username}!')
return redirect('index')
else:
# GET 请求:显示空白注册表单 → # GET リクエスト:空の登録フォームを表示
form = RegisterForm()
return render(request, 'blog/register.html', {
'form': form,
'title': '注册 - サンプル 博客' → '登録 - サンプル ブログ'
})
Django の → Django の
messagesフレームワークは、リクエスト間で一度きりのメッセージ(「登録成功」など)を渡すために使用されます。テンプレートで messages 領域を描画すると、ユーザーは操作フィードバックを確認できます。これはセッションと連携して動作し、メッセージは一度表示されると自動的に消えます。
ログインとログアウト
Django にはログインビューとログアウトビューが組み込まれているので、ルーティングで導入するだけで済みます。
例
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('post/<int:pk>/', views.post_detail, name='post_detail'),
path('register/', views.register, name='register'),
# Django 内置登录视图 → # Django 組み込みログインビュー
# template_name:指定使用哪个模板 → # template_name:使用するテンプレートを指定
path('login/', auth_views.LoginView.as_view(
template_name='blog/login.html',
redirect_authenticated_user=True # 已登录用户访问 login 直接跳转 → # ログイン済みユーザーが login にアクセスした場合は直接リダイレクト
), name='login'),
# Django 内置登出视图 → # Django 組み込みログアウトビュー
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
settings.py でログイン・ログアウトのリダイレクト先を設定します:
例
LOGIN_URL = 'login' # 未登录用户访问保护页面时跳转到登录页 → # 未ログインユーザーが保護ページにアクセスした場合、ログインページへリダイレクト
LOGIN_REDIRECT_URL = 'index' # 登录成功后跳转到首页 → # ログイン成功後にホームページへリダイレクト
LOGOUT_REDIRECT_URL = 'index' # 登出后跳转到首页 → # ログアウト後にホームページへリダイレクト
创建认证相关模板 → 認証関連テンプレートを作成する
登录模板 → ログインテンプレート
例
{% extends 'blog/base.html' %}
{% block title %}登录 - サンプル 博客{% endblock %} → {% block title %}ログイン - サンプル ブログ{% endblock %}
{% block content %}
<div class="auth-form">
<h2>登录 → ログイン</h2>
<form method="post">
{% csrf_token %}
<div class="form-group">
<label>用户名 → ユーザー名</label>
{{ form.username }}
</div>
<div class="form-group">
<label>密码 → パスワード</label>
{{ form.password }}
</div>
{% if form.errors %}
<p class="error-msg">用户名或密码错误,请重试。 → ユーザー名またはパスワードが間違っています。もう一度お試しください。</p>
{% endif %}
<button type="submit" class="btn-submit">登录 → ログイン</button>
</form>
<p class="form-footer">
还没有账号? → アカウントをお持ちでないですか?<a href="{% url 'register' %}">立即注册 → 今すぐ登録</a>
</p>
</div>
{% endblock %}
注册模板 → 登録テンプレート
例
{% extends 'blog/base.html' %}
{% block title %}注册 - サンプル 博客{% endblock %} → {% block title %}登録 - サンプル ブログ{% endblock %}
{% block content %}
<div class="auth-form">
<h2>注册 → 登録</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn-submit">注册 → 登録</button>
</form>
<p class="form-footer">
已有账号? → すでにアカウントをお持ちですか?<a href="{% url 'login' %}">立即登录 → 今すぐログイン</a>
</p>
</div>
{% endblock %}
{% csrf_token %}これは Django のセキュリティ機構であり、クロスサイトリクエストフォージェリ攻撃を防ぎます。すべての POST フォームにはこれを含める必要があります。そうしないと Django はリクエストを拒否します(403 エラー)。このタグは、ランダムな CSRF トークンを含む隠し input を生成します。
ナビゲーションバーにログイン状態を表示する
base.html のナビゲーションバーを更新し、ログイン状態に応じて異なる内容を表示します。
例
<header class="navbar">
<a href="/" class="logo">サンプル 博客 → サンプル ブログ</a>
<nav>
<a href="/">首页 → ホーム</a>
{% if user.is_authenticated %}
{# ログイン済み:ユーザー名とログアウトボタンを表示します(user は Django によって自動的に注入されます) #}
<span class="user-name">{{ user.username }}</span>
<a href="{% url 'logout' %}">登出 → ログアウト</a>
{% else %}
{# 未ログイン:ログインと登録リンクを表示 #}
<a href="{% url 'login' %}">登录 → ログイン</a>
<a href="{% url 'register' %}">注册 → 登録</a>
{% endif %}
</nav>
</header>
Django のテンプレートコンテキストプロセッサは自動的に
{{ user }}各テンプレートに注入され、views.py で手動で渡す必要はありません。~を通じて行うことができます。user.is_authenticatedユーザーがログインしているかどうかを判断します。
登录页面样式 → ログインページのスタイル
例
.auth-form {
max-width: 400px;
margin: 40px auto;
padding: 30px;
background: #fff;
border-radius: 12px;
box-shadow: 0 2px 12px rgba(0,0,0,0.08);
}
.auth-form h2 {
margin-bottom: 24px;
text-align: center;
}
.auth-form .form-group {
margin-bottom: 16px;
}
.auth-form label {
display: block;
margin-bottom: 6px;
font-weight: 500;
}
.auth-form input {
width: 100%;
padding: 10px 12px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 14px;
}
.btn-submit {
width: 100%;
padding: 12px;
background: #2c3e50;
color: #fff;
border: none;
border-radius: 6px;
font-size: 16px;
cursor: pointer;
margin-top: 10px;
}
.error-msg {
color: #e74c3c;
font-size: 14px;
}
.form-footer {
margin-top: 16px;
text-align: center;
font-size: 14px;
}
.user-name {
color: #2c3e50;
font-weight: 500;
}
本章小结 → 本章のまとめ
本章你接入た Django 内置认证系统:继承た UserCreationForm 创建注册表单、使用 LoginView/LogoutView 实现登录登出、用 csrf_token 保护 POST 请求、に模板中使用 user.is_authenticated 判断登录状态。 → この章では、Django 組み込みの認証システムを導入しました。UserCreationForm を継承して登録フォームを作成し、LoginView/LogoutView を使用してログイン・ログアウトを実装し、csrf_token で POST リクエストを保護し、テンプレート内で user.is_authenticated を使用してログイン状態を判定しました。
これでブログに完全なユーザー登録・ログイン・ログアウトのフローが備わりました。
其他扩展 → その他の拡張