pip install django
django-admin startproject mysite
cd mysite
python manage.py startapp blog
よく使うコマンド
runserver
ポート 8000 で開発サーバーを起動
makemigrations
モデル変更からマイグレーションファイルを生成
migrate
データベースにマイグレーションを適用
createsuperuser
管理者スーパーユーザーを作成
shell
Django 付きの対話型 Python シェル
test
テストスイートを実行
プロジェクト構造
manage.py
CLI エントリーポイント
settings.py
プロジェクト設定
urls.py
ルート URL 設定
wsgi.py / asgi.py
サーバーエントリーポイント
apps/models.py
データベースモデル
apps/views.py
リクエストハンドラ
モデル
モデルの定義
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
created = models.DateTimeField(auto_now_add=True)
published = models.BooleanField(default=False)
from django.views.generic import ListView, DetailView
class PostListView(ListView):
model = Post
template_name = 'blog/list.html'
context_object_name = 'posts'
paginate_by = 10
よく使う CBV
ListView
オブジェクトのリストを表示
DetailView
単一オブジェクトを表示
CreateView
オブジェクト作成フォーム
UpdateView
オブジェクト編集フォーム
DeleteView
確認してオブジェクトを削除
TemplateView
テンプレートをレンダリング(モデルなし)
JSON レスポンス
from django.http import JsonResponse
def api_posts(request):
data = list(Post.objects.values('id', 'title'))
return JsonResponse(data, safe=False)
テンプレート
テンプレート構文
{{ variable }}
{{ post.title|truncatewords:30 }}
{% if user.is_authenticated %}
from django.db.models import Q, Count, Avg
Post.objects.filter(
Q(title__icontains='django') | Q(body__icontains='django')
).order_by('-created')[:10]
Post.objects.aggregate(avg_views=Avg('views'))
作成、更新、削除
post = Post.objects.create(title='New', body='...')
post.title = 'Updated'
post.save()
Post.objects.filter(draft=True).update(published=False)
post.delete()
認証
ログイン / ログアウト
from django.contrib.auth import authenticate, login, logout
user = authenticate(request, username='admin', password='pw')
if user is not None:
login(request, user)
ビューの保護
from django.contrib.auth.decorators import login_required
@login_required
def dashboard(request):
return render(request, 'dashboard.html')