Django開発の基本操作まとめ。プロジェクト作成・URLパラメータ・ログイン必須化・ユーザー情報取得

Django開発の基本操作まとめ。プロジェクト作成・URLパラメータ・ログイン必須化・ユーザー情報取得

Django開発でよく使う基本操作を、この記事1本にまとめて解説します。

  1. プロジェクトの作成と起動(startproject / runserver)
  2. URLパラメータをviewで受け取る
  3. 特定Viewをログイン必須にする(login_required)
  4. ログイン中のユーザー情報を取得する
  5. テンプレートで日付フォーマットを変更する

1. プロジェクトの作成と起動

プロジェクトの作成:startproject

django-admin startproject mysite

実行すると、指定した名前のフォルダにプロジェクトの雛形が作成されます。

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
ファイル役割
manage.pyプロジェクトに対する各種操作を行うコマンドラインユーティリティ
mysite/settings.pyDjangoの設定ファイル。データベースや静的ファイルの指定など
mysite/urls.pyプロジェクトのURL制御(ルーティング)ファイル
mysite/asgi.py / wsgi.pyASGI/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.pyALLOWED_HOSTS へアクセスに使うホストを追記します。

ALLOWED_HOSTS = ['*']   # 開発時のみ。本番では実ホスト名を列挙する

ブラウザで http://サーバのIPアドレス:8000/ にアクセスし、Djangoのロケットのページが表示されれば成功です。DisallowedHostエラーが出る場合はよくあるエラーまとめを参照してください。

参考: django-admin と manage.py

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の環境設定・運用まとめを参考にしてください。

技術ブログ一覧へ戻る