ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Django プロジェクトとアプリの違い
Django では「プロジェクト」と「アプリケーション」を分けて考えます。プロジェクトは Web サイト全体(設定・ルーティング・WSGI 等の入れ物)、アプリケーションはその中の機能モジュール(ブログ機能、ユーザー機能、API 機能など)。
| 用語 | 役割 | 作成コマンド |
|---|---|---|
| プロジェクト (mysite) | 設定 / ルーティングのトップ / WSGI | django-admin startproject mysite |
| アプリ (blog) | 機能単位の MVT 構成 | python manage.py startapp blog |
ステップ 1: アプリを生成
プロジェクト直下(manage.py がある階層)で次のコマンドを実行します:
# プロジェクト作成済の場合(mysite/ が存在)
cd mysite
# アプリ作成
python manage.py startapp blog
# 生成されるディレクトリ
# blog/
# ├── __init__.py
# ├── admin.py # 管理画面登録
# ├── apps.py # アプリ設定クラス
# ├── migrations/
# │ └── __init__.py
# ├── models.py # DB モデル定義
# ├── tests.py # テスト
# └── views.py # ビュー関数 / クラス
注意: urls.py と templates/ static/ ディレクトリは自動生成されません。後で手動で作成します。
ステップ 2: INSTALLED_APPS への登録
Django にアプリの存在を認識させるため mysite/settings.py の INSTALLED_APPS に追記します:
# mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog.apps.BlogConfig', # ← 追加(推奨: AppConfig 経由)
# 短縮形でもOK: 'blog',
]
blog.apps.BlogConfig を指定すると、apps.py 内の設定(verbose_name など)が反映されます。短く 'blog' でも動作しますが、明示的な書き方が推奨です。
ステップ 3: ルーティング設定
プロジェクトの urls.py からアプリの urls.py をインクルードします:
# mysite/urls.py(プロジェクト側)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')), # ← /blog/ 以下を blog アプリに委譲
]
アプリ側に urls.py を新規作成します(自動生成されないため):
# blog/urls.py(新規作成)
from django.urls import path
from . import views
app_name = 'blog' # 名前空間({% url 'blog:index' %} で参照できる)
urlpatterns = [
path('', views.index, name='index'),
path('<int:pk>/', views.detail, name='detail'),
path('create/', views.PostCreateView.as_view(), name='create'),
]
ステップ 4: ビューを書く
関数ベースビュー (FBV) と クラスベースビュー (CBV) の 2 系統があります:
# blog/views.py
from django.shortcuts import render, get_object_or_404
from django.views.generic import CreateView
from .models import Post
# 関数ベースビュー
def index(request):
posts = Post.objects.order_by('-created_at')[:20]
return render(request, 'blog/index.html', {'posts': posts})
def detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/detail.html', {'post': post})
# クラスベースビュー(汎用ビュー)
class PostCreateView(CreateView):
model = Post
fields = ['title', 'body']
template_name = 'blog/form.html'
success_url = '/blog/'
ステップ 5: モデル定義 → マイグレーション
# blog/models.py
from django.db import models
class Post(models.Model):
title = models.CharField('タイトル', max_length=200)
body = models.TextField('本文')
created_at = models.DateTimeField('作成日時', auto_now_add=True)
class Meta:
db_table = 'blog_post'
ordering = ['-created_at']
verbose_name = '記事'
verbose_name_plural = '記事一覧'
def __str__(self):
return self.title# マイグレーションファイル生成
python manage.py makemigrations blog
# DB に反映
python manage.py migrate
# 確認
python manage.py showmigrations blog
ステップ 6: 管理画面に登録
# blog/admin.py
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'created_at')
search_fields = ('title', 'body')
list_filter = ('created_at',)
ordering = ('-created_at',)# 管理ユーザ作成
python manage.py createsuperuser
# 起動
python manage.py runserver
# ブラウザで http://127.0.0.1:8000/admin/
ステップ 7: テンプレートと静的ファイルのディレクトリ
自動生成されないので手動で作ります:
mkdir -p blog/templates/blog
mkdir -p blog/static/blog/css
mkdir -p blog/static/blog/js
mkdir -p blog/static/blog/img
# テンプレ例
cat > blog/templates/blog/index.html <<EOF
{% extends 'base.html' %}
{% block content %}
<h1>記事一覧</h1>
<ul>
{% for post in posts %}
<li><a href="{% url 'blog:detail' post.pk %}">{{ post.title }}</a></li>
{% endfor %}
</ul>
{% endblock %}
EOF
apps.py のカスタマイズ
# blog/apps.py
from django.apps import AppConfig
class BlogConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'blog'
verbose_name = 'ブログ機能'
def ready(self):
# シグナル登録など起動時処理をここに
import blog.signals # noqa
FAQ
Q: アプリは小さく分けるべき?
A: Django 公式は「1 つのことをうまくこなす再利用可能な単位」を推奨。ユーザ・ブログ・API などで分けるのが定石です。
Q: アプリ名と URL prefix を合わせるべき?
A: 合わせる必要はありません。path('articles/', include('blog.urls')) も可。アプリ内 app_name で名前空間を分離します。
Q: startapp 後に名前を変えたい
A: ディレクトリ名 / INSTALLED_APPS / apps.py 内 name / migrations のテーブル名 / インポート全箇所を一括変更する必要あり。初期段階で命名を確定するのが安全です。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?