タイトル: ユーザーの作成
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='taro',
email='taro@example.com',
password='secret123', # 自動でハッシュ化される
)
# 追加情報を後から設定
user.first_name = '太郎'
user.last_name = '山田'
user.save()
# スーパーユーザーを作る
admin = User.objects.create_superuser(
username='admin',
email='admin@example.com',
password='adminpass',
)</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='taro', password='secret123')
# ✅ 正解
User.objects.create_user(username='taro', password='secret123')
# create() を使うなら set_password() でハッシュ化
user = User(username='taro')
user.set_password('secret123')
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 == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user) # 登録後すぐログイン状態に
return redirect('home')
else:
form = UserCreationForm()
return render(request, 'signup.html', {'form': 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='avatars/', 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 = 'accounts.User' # ★ 必須
INSTALLED_APPS = [
# ...
'accounts', # カスタム 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('Email is required')
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('is_staff', True)
extra.setdefault('is_superuser', 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 = 'email'
REQUIRED_FIELDS = ['name']</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('demo123')
'pbkdf2_sha256$...'</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='admin').exists():
User.objects.create_superuser(
username='admin',
email='admin@example.com',
password='changeme',
)
class Migration(migrations.Migration):
dependencies = [('accounts', '0001_initial')]
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>