用户系统 — 注册、登录、登出 → ユーザーシステム — 登録、ログイン、ログアウト

この章では、Django 組み込みの認証システムを使って、ユーザー登録・ログイン・ログアウト機能を実装します。


Django 内置 auth 系统 → Django 組み込み auth システム

Django には完全なユーザー認証モジュールが標準で用意されています:

  • 内置 → 組み込みUser模型(用户名、密码、邮箱等) → モデル(ユーザー名、パスワード、メールアドレスなど)
  • 内置登录/登出视图(无需自己写逻辑) → 組み込みのログイン/ログアウトビュー(自分でロジックを書く必要なし)
  • 組み込みの権限とグループ管理
  • フォーム検証とセキュリティ対策(CSRF、XSS)

このモジュールはdjango.contrib.authプロジェクト作成時にデフォルトで INSTALLED_APPS に登録されています。


注册页面 → 登録ページ

Django にはログイン/ログアウトビューは組み込まれていますが、登録ビューは組み込まれていないため、自分で作成する必要があります。

第一步:创建注册表单 → ステップ1:登録フォームを作成する

例

# 文件路径:blog/forms.py(新建文件) → # ファイルパス:blog/forms.py(新規ファイル)
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:登録ビューを書く

例

# 文件路径:blog/views.py 新增 → # ファイルパス:blog/views.py に追加
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 にはログインビューとログアウトビューが組み込まれているので、ルーティングで導入するだけで済みます。

例

# 文件路径:blog/urls.py → # ファイルパス:blog/urls.py
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 でログイン・ログアウトのリダイレクト先を設定します:

例

# 文件路径:blog_project/settings.py 末尾添加 → # ファイルパス:blog_project/settings.py の末尾に追加
LOGIN_URL = 'login'                    # 未登录用户访问保护页面时跳转到登录页 → # 未ログインユーザーが保護ページにアクセスした場合、ログインページへリダイレクト
LOGIN_REDIRECT_URL = 'index'           # 登录成功后跳转到首页 → # ログイン成功後にホームページへリダイレクト
LOGOUT_REDIRECT_URL = 'index'          # 登出后跳转到首页 → # ログアウト後にホームページへリダイレクト

创建认证相关模板 → 認証関連テンプレートを作成する

登录模板 → ログインテンプレート

例

<!-- 文件路径:blog/templates/blog/login.html --> → <!-- ファイルパス:blog/templates/blog/login.html -->
{% 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 %}

注册模板 → 登録テンプレート

例

<!-- 文件路径:blog/templates/blog/register.html --> → <!-- ファイルパス:blog/templates/blog/register.html -->
{% 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 のナビゲーションバーを更新し、ログイン状態に応じて異なる内容を表示します。

例

<!-- blog/templates/blog/base.html のナビゲーションバー部分を変更 --> → <!-- blog/templates/blog/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ユーザーがログインしているかどうかを判断します。


登录页面样式 → ログインページのスタイル

例

/* base.html の style 内に追加 */ → /* base.html の style 内に追加 */
.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 を使用してログイン状態を判定しました。

これでブログに完全なユーザー登録・ログイン・ログアウトのフローが備わりました。

其他扩展 → その他の拡張