この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: ユーザーの作成
SEOタイトル: Django ユーザー作成完全ガイド (createsuperuser/User Model)

この本文には実行可能なタグ等が含まれるため、安全のためHTMLソースとして表示しています。本文データは変更していません。

<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;background:#fffbea;border:1px solid #f4c430;margin:1em 0;width:100%"><tr><td style="background:#f4c430;color:#000;font-weight:bold;padding:8px">この記事の要点</td></tr><tr><td style="padding:10px"><ul><li>管理者を作るなら <strong><code>python manage.py createsuperuser</code></strong>。対話形式で username / email / password</li><li>プログラムから作るなら <strong><code>User.objects.create_user(username, email, password)</code></strong>。パスワードは自動でハッシュ化される</li><li><strong><code>create()</code> ではなく <code>create_user()</code></strong> を使う。前者は生パスワードを保存してしまう</li><li>独自フィールドを追加したい場合は <strong><code>AbstractUser</code> を継承</strong>して <code>AUTH_USER_MODEL</code> に設定</li><li><strong>fixtures / data migration</strong> で初期ユーザーを自動投入することも可能</li></ul></td></tr></table>
<h2>Django におけるユーザーの基本</h2>

<p>Django の認証システムは <code>django.contrib.auth</code> アプリにまとめられており、デフォルトで<strong><code>User</code> モデル</strong>が提供されます。<code>User</code> はユーザー名・メールアドレス・パスワード・権限情報を持つモデルです。</p>

<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;width:100%">
<thead><tr style="background:#e3f2fd"><th>フィールド</th><th>型</th><th>説明</th></tr></thead>
<tbody>
<tr><td>username</td><td>CharField(150)</td><td>ユーザー名(一意)</td></tr>
<tr><td>email</td><td>EmailField</td><td>メールアドレス</td></tr>
<tr><td>password</td><td>CharField(128)</td><td>ハッシュ化されたパスワード</td></tr>
<tr><td>first_name / last_name</td><td>CharField</td><td>氏名(任意)</td></tr>
<tr><td>is_staff</td><td>Boolean</td><td>管理画面にログインできるか</td></tr>
<tr><td>is_superuser</td><td>Boolean</td><td>全権限を持つスーパーユーザー</td></tr>
<tr><td>is_active</td><td>Boolean</td><td>ログイン可能か(ソフト削除に使う)</td></tr>
<tr><td>date_joined</td><td>DateTime</td><td>登録日時</td></tr>
<tr><td>last_login</td><td>DateTime</td><td>最終ログイン</td></tr>
</tbody>
</table>

<h2>方法1: createsuperuser コマンドで管理者を作る</h2>

<p>Django 管理画面(<code>/admin/</code>)にログインできる<strong>スーパーユーザー</strong>を作る最も簡単な方法:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-bash"># 対話形式
python manage.py createsuperuser

# プロンプト:
# Username: admin
# Email address: admin@example.com
# Password: ********
# Password (again): ********
# Superuser created successfully.

# 非対話モード(CI 用)
DJANGO_SUPERUSER_USERNAME=admin \
DJANGO_SUPERUSER_EMAIL=admin@example.com \
DJANGO_SUPERUSER_PASSWORD=secret123 \
python manage.py createsuperuser --noinput</code></pre>
<p>作成後、<code>/admin/</code> にアクセスして作成した認証情報でログインできれば成功です。</p>

<h2>方法2: ORM から create_user() でユーザーを作る</h2>

<p>登録機能やシード処理など、Python コードからユーザーを作るときの定番:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-python">from django.contrib.auth import get_user_model

User = get_user_model()  # ★ カスタム User にも対応する書き方

# 一般ユーザーを作る
user = User.objects.create_user(
    username=&apos;taro&apos;,
    email=&apos;taro@example.com&apos;,
    password=&apos;secret123&apos;,  # 自動でハッシュ化される
)

# 追加情報を後から設定
user.first_name = &apos;太郎&apos;
user.last_name = &apos;山田&apos;
user.save()

# スーパーユーザーを作る
admin = User.objects.create_superuser(
    username=&apos;admin&apos;,
    email=&apos;admin@example.com&apos;,
    password=&apos;adminpass&apos;,
)</code></pre>
<p><strong>絶対に <code>User.objects.create()</code> を使わないでください</strong>。生パスワードが DB に保存されてしまいます:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-python"># ❌ 危険: パスワードが平文で保存される
User.objects.create(username=&apos;taro&apos;, password=&apos;secret123&apos;)

# ✅ 正解
User.objects.create_user(username=&apos;taro&apos;, password=&apos;secret123&apos;)

# create() を使うなら set_password() でハッシュ化
user = User(username=&apos;taro&apos;)
user.set_password(&apos;secret123&apos;)
user.save()</code></pre>
<h2>方法3: 管理画面(Admin UI)で作る</h2>

<p>スーパーユーザーでログインした後、Admin UI から GUI でユーザーを作れます:</p>

<ol>
<li><code>/admin/</code> にログイン</li>
<li>「Users」セクションの「Add」をクリック</li>
<li>username と password を入力 → Save</li>
<li>編集画面で email / first_name / 権限 / グループを設定</li>
</ol>

<h2>方法4: UserCreationForm で登録機能を作る</h2>

<p>Django には<strong>登録フォーム</strong>として <code>UserCreationForm</code> が用意されています:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-python"># accounts/views.py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login
from django.shortcuts import render, redirect

def signup(request):
    if request.method == &apos;POST&apos;:
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)  # 登録後すぐログイン状態に
            return redirect(&apos;home&apos;)
    else:
        form = UserCreationForm()
    return render(request, &apos;signup.html&apos;, {&apos;form&apos;: form})</code></pre><pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-html">{# signup.html #}
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">登録</button>
</form></code></pre>
<h2>カスタム User モデルを作る</h2>

<p>標準の <code>User</code> に独自フィールド(プロフィール画像、電話番号、会社名など)を追加したい場合は、<strong>プロジェクト初期から</strong>カスタム User を設計します。後から差し替えるのは非常に困難なので、<strong>最初の <code>migrate</code> 前に</strong>必ず実装してください。</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-python"># accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    phone = models.CharField(max_length=20, blank=True)
    company = models.CharField(max_length=100, blank=True)
    avatar = models.ImageField(upload_to=&apos;avatars/&apos;, blank=True, null=True)

    def __str__(self):
        return self.username</code></pre><pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-python"># settings.py
AUTH_USER_MODEL = &apos;accounts.User&apos;  # ★ 必須

INSTALLED_APPS = [
    # ...
    &apos;accounts&apos;,  # カスタム User がある app
]</code></pre>
<h2>メールアドレスでログインさせたい場合</h2>

<p>標準ではログイン ID は <code>username</code> ですが、<strong>email でログイン</strong>させたい場合は <code>AbstractBaseUser</code> + <code>BaseUserManager</code> で独自実装します:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-python">from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models

class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra):
        if not email:
            raise ValueError(&apos;Email is required&apos;)
        email = self.normalize_email(email)
        user = self.model(email=email, **extra)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra):
        extra.setdefault(&apos;is_staff&apos;, True)
        extra.setdefault(&apos;is_superuser&apos;, True)
        return self.create_user(email, password, **extra)

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=100)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    objects = UserManager()
    USERNAME_FIELD = &apos;email&apos;
    REQUIRED_FIELDS = [&apos;name&apos;]</code></pre>
<h2>fixtures で初期ユーザーを投入</h2>

<p>テスト・デモ環境用に初期ユーザーをまとめて投入したい場合:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-json">// accounts/fixtures/initial_users.json
[
  {
    "model": "auth.user",
    "pk": 1,
    "fields": {
      "username": "demo",
      "password": "pbkdf2_sha256$390000$xxx...",
      "is_active": true
    }
  }
]</code></pre><pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-bash"># 投入
python manage.py loaddata initial_users

# パスワードハッシュは事前にシェルで生成
python manage.py shell
>>> from django.contrib.auth.hashers import make_password
>>> make_password(&apos;demo123&apos;)
&apos;pbkdf2_sha256$...&apos;</code></pre>
<h2>data migration で安全に投入</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-python"># accounts/migrations/0002_create_admin.py
from django.db import migrations

def create_admin(apps, schema_editor):
    from django.contrib.auth import get_user_model
    User = get_user_model()
    if not User.objects.filter(username=&apos;admin&apos;).exists():
        User.objects.create_superuser(
            username=&apos;admin&apos;,
            email=&apos;admin@example.com&apos;,
            password=&apos;changeme&apos;,
        )

class Migration(migrations.Migration):
    dependencies = [(&apos;accounts&apos;, &apos;0001_initial&apos;)]
    operations = [migrations.RunPython(create_admin, migrations.RunPython.noop)]</code></pre>
<h2>FAQ</h2>

<p><strong>Q: パスワードを忘れた</strong><br />
A: <code>python manage.py changepassword <username></code> でリセットできます。</p>

<p><strong>Q: <code>User</code> モデルを途中で差し替えたい</strong><br />
A: ほぼ不可能です。新規データベースから作り直しになります。プロジェクト開始時に必ず判断してください。</p>

<p><strong>Q: 認証情報の保存場所は?</strong><br />
A: デフォルトでは <code>auth_user</code> テーブル。カスタム User の場合は <code><app>_user</code> テーブル。</p>

<p><strong>Q: パスワードハッシュアルゴリズムは?</strong><br />
A: デフォルトで <code>PBKDF2 + SHA256</code>。<code>PASSWORD_HASHERS</code> 設定で Argon2 / bcrypt にも切り替え可能。</p>