Django開発の基本操作まとめ。プロジェクト作成・URLパラメータ・ログイン必須化・ユーザー情報取得
Django開発でよく使う基本操作を、この記事1本にまとめて解説します。
- プロジェクトの作成と起動(startproject / runserver)
- URLパラメータをviewで受け取る
- 特定Viewをログイン必須にする(login_required)
- ログイン中のユーザー情報を取得する
- テンプレートで日付フォーマットを変更する
1. プロジェクトの作成と起動
プロジェクトの作成:startproject
django-admin startproject mysite
実行すると、指定した名前のフォルダにプロジェクトの雛形が作成されます。
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
| ファイル | 役割 |
|---|---|
manage.py | プロジェクトに対する各種操作を行うコマンドラインユーティリティ |
mysite/settings.py | Djangoの設定ファイル。データベースや静的ファイルの指定など |
mysite/urls.py | プロジェクトのURL制御(ルーティング)ファイル |
mysite/asgi.py / wsgi.py | ASGI/WSGI互換Webサーバーのエントリーポイント |
ビルトインサーバーの起動:runserver
python manage.py runserver [アドレス:ポート番号]
ポートを指定しない場合は8000番、リッスンアドレスは localhost(127.0.0.1)で起動します。この場合、別マシンから IPアドレス:8000 へアクセスしてもエラーになります。
外部からのアクセスを受けるには、全アドレスでリッスンさせます。
python manage.py runserver 0:8000 # 0.0.0.0:8000 と同じ意味
あわせて settings.py の ALLOWED_HOSTS へアクセスに使うホストを追記します。
ALLOWED_HOSTS = ['*'] # 開発時のみ。本番では実ホスト名を列挙する
ブラウザで http://サーバのIPアドレス:8000/ にアクセスし、Djangoのロケットのページが表示されれば成功です。DisallowedHostエラーが出る場合はよくあるエラーまとめを参照してください。
2. URLパラメータをviewで受け取る
/articles/5/ のようなパラメータ付きURLは、一般的なWebサービスや企業向けシステムでほぼ確実に使います。サンプルはint型ですが、str型やUUID型も同様に書けます。
関数ベースビュー
urls.py でパラメータを定義します。
from django.urls import path
from . import views
urlpatterns = [
path('<int:id>/', views.index, name='index'),
]
view関数の引数としてパラメータを受け取れます。
from django.http import HttpResponse
def index(request, id):
return HttpResponse(f"ID is {id}")
クラスベースビュー
from django.urls import path
from .views import IndexView
urlpatterns = [
path('<int:id>/', IndexView.as_view(), name='index'),
]
パラメータは kwargs(辞書型)で渡されます。
from django.views.generic import TemplateView
class IndexView(TemplateView):
template_name = 'index.html'
def get(self, request, **kwargs):
ctx = {
'id': kwargs['id'],
}
return self.render_to_response(ctx)
なお DetailView を使う場合、パラメータ名は pk または slug にする必要があります(よくあるエラーまとめ参照)。
3. 特定Viewをログイン必須にする:login_required
関数ベース・クラスベースともにデコレーターで実現できます。
関数ベースビュー
from django.contrib.auth.decorators import login_required
@login_required
def index(request):
...
クラスベースビュー
method_decorator でdispatchメソッドへデコレーターを適用します。
from django.views.generic import TemplateView
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
@method_decorator(login_required, name='dispatch')
class IndexView(TemplateView):
...
LoginRequiredMixin を使う方法もあります。Mixinは継承リストの先頭(Viewクラスより左)に書く点に注意してください。
from django.views.generic import TemplateView
from django.contrib.auth.mixins import LoginRequiredMixin
class IndexView(LoginRequiredMixin, TemplateView):
...
4. ログイン中のユーザー情報を取得する
次のようなシーンで使います。
- ログイン中のユーザーによって処理を変えたい
- ユーザー情報をcontextとしてテンプレートに渡したい
- ログイン情報を元に別のデータを取得したい
関数ベースビュー
requestオブジェクトから取得できます。
def index(request):
user = request.user # ユーザーオブジェクト
user_id = request.user.id # ユーザーID
クラスベースビュー
self.request.user がインスタンス変数として使えます。
class IndexView(TemplateView):
template_name = 'index.html'
def get(self, request, **kwargs):
ctx = {
'user': self.request.user,
'username': self.request.user.username,
}
return self.render_to_response(ctx)
5. テンプレートで日付フォーマットを変更する
テンプレート内では date フィルタでdatetime型のフォーマットを変更できます。
{{ 変数名|date:"フォーマット" }}
ミリ秒まで表示するサンプル:
{{ create_date|date:"Y年m月d日 H:i:s.u" }}
2021年02月20日 14:33:15.607926 のように表示されます。
参考: Built-in template tags and filters - date
まとめ
| やりたいこと | 方法 |
|---|---|
| プロジェクト作成 | django-admin startproject <名前> |
| 外部からアクセス可能に起動 | runserver 0:8000 + ALLOWED_HOSTS |
| URLパラメータ | path('<int:id>/', ...) + 引数 / kwargs |
| ログイン必須化 | @login_required / LoginRequiredMixin |
| ログインユーザー取得 | request.user / self.request.user |
| 日付フォーマット | `{{ 変数 |
認証機能の本格的な実装はdjango-allauth入門ガイド、環境ごとの設定分割やメール送信はDjangoの環境設定・運用まとめを参考にしてください。