基本的な投票アプリケーションの作成

DjangoDjangoBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このチュートリアルでは、基本的なアンケートアプリケーションの作成方法を説明します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL django(("Django")) -.-> django/CoreConfigurationandRoutingGroup(["Core Configuration and Routing"]) django(("Django")) -.-> django/DatabaseModelsandMigrationsGroup(["Database, Models, and Migrations"]) django(("Django")) -.-> django/DevelopmentandAdministrationToolsGroup(["Development and Administration Tools"]) django/CoreConfigurationandRoutingGroup -.-> django/django_urls("Django Urls") django/DatabaseModelsandMigrationsGroup -.-> django/request_and_response("Request and Response") django/DevelopmentandAdministrationToolsGroup -.-> django/contrib_packages("Contrib Packages") subgraph Lab Skills django/django_urls -.-> lab-153741{{"基本的な投票アプリケーションの作成"}} django/request_and_response -.-> lab-153741{{"基本的な投票アプリケーションの作成"}} django/contrib_packages -.-> lab-153741{{"基本的な投票アプリケーションの作成"}} end

概要

例を見ながら学びましょう。

このチュートリアルでは、基本的なアンケートアプリケーションの作成方法を説明します。

このアプリケーションは2つの部分で構成されます。

  • アンケートを閲覧して投票できるパブリックサイト
  • アンケートを追加、変更、削除できる管理サイト

既にDjangoがインストールされていると仮定します。シェルプロンプトで次のコマンドを実行することで、Djangoがインストールされているかどうかとそのバージョンを確認できます。

python -m django --version

Djangoがインストールされている場合、インストールされているバージョンが表示されます。インストールされていない場合、「No module named django」というエラーが表示されます。

このチュートリアルはPython 3.10以降をサポートするDjango向けに書かれています。Djangoのバージョンが一致しない場合は、このページの右下のバージョン切り替えツールを使用して、自分のDjangoのバージョンに対応するチュートリアルを参照するか、Djangoを最新バージョンに更新してください。

プロジェクトの作成

Djangoを初めて使用する場合、初期設定を行う必要があります。具体的には、Djangoの「プロジェクト」を自動生成する必要があります。これは、Djangoのインスタンスの設定のコレクションであり、データベース構成、Django固有のオプション、アプリケーション固有の設定を含みます。

コマンドラインから、コードを保存したいディレクトリに移動してから、次のコマンドを実行します。

cd ~/project
django-admin startproject mysite

これにより、現在のディレクトリに mysite ディレクトリが作成されます。

startproject が作成したものを見てみましょう。

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

これらのファイルは以下の通りです。

  • 外側の mysite/ ルートディレクトリは、プロジェクトのコンテナです。その名前はDjangoにとっては重要ではありません。好きな名前に変更できます。
  • manage.py:Djangoプロジェクトと様々な方法で対話できるコマンドラインユーティリティ。
  • 内側の mysite/ ディレクトリは、プロジェクトの実際のPythonパッケージです。その名前は、その中にある何かをインポートする際に使用するPythonパッケージ名です(例:mysite.urls)。
  • mysite/__init__.py:空のファイルで、このディレクトリがPythonパッケージとして見なされるようにPythonに伝えます。
  • mysite/settings.py:このDjangoプロジェクトの設定/構成。
  • mysite/urls.py:このDjangoプロジェクトのURL宣言;Djangoで動作するサイトの「目次」。
  • mysite/asgi.py:ASGI互換のWebサーバーがプロジェクトを提供するためのエントリポイント。
  • mysite/wsgi.py:WSGI互換のWebサーバーがプロジェクトを提供するためのエントリポイント。

開発サーバー

Djangoプロジェクトが正常に動作することを確認しましょう。まだ行っていなければ、外側の mysite ディレクトリに移動して、次のコマンドを実行します。

cd ~/project/mysite
python manage.py runserver

コマンドラインに次の出力が表示されます。

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them.

- 15:50:53 Django version, using settings'mysite.settings' Starting development server at <http://127.0.0.1:8000/> Quit the server with CONTROL-C.

まだ適用されていないデータベースマイグレーションに関する警告は今は無視してください。すぐ後でデータベースについて対処します。

Djangoの開発サーバーを起動しました。これは、純粋にPythonで書かれた軽量なWebサーバーです。Djangoにこれを含めたのは、本番環境用のサーバー(たとえばApache)を設定する面倒を省き、本番環境に備えるまで迅速に開発できるようにするためです。

ここで注意しておくことが重要です。本番環境に似た環境ではこのサーバーを使わないでください。これは開発中にのみ使用することを想定しています。(私たちはWebフレームワークを作るビジネスをしているので、Webサーバーは作っていません。)

サーバーが起動したら、Webブラウザで http://127.0.0.1:8000/ にアクセスしてください。または、ターミナルで curl 127.0.0.1:8000 を実行しても良いです。「おめでとうございます!」というページが表示され、ロケットが打ち上がっているはずです。成功です!

LabEx VMでは、LabExドメインを ALLOWED_HOSTS に追加する必要があります。mysite/settings.py を編集して、ALLOWED_HOSTS の末尾に * を追加します。このようになります。

ALLOWED_HOSTS = ["*"]

これにより、Djangoに任意のホストヘッダーでリクエストを処理することが許可されるようになります。

Django development server running

ポートの変更

デフォルトでは、runserver コマンドは内部IPのポート8000で開発サーバーを起動します。

サーバーのポートを変更したい場合は、コマンドライン引数として指定します。たとえば、このコマンドはポート8080でサーバーを起動します。

python manage.py runserver 8080

サーバーのIPを変更したい場合は、ポートと一緒に指定します。たとえば、すべての利用可能なパブリックIPでリッスンするには(Vagrantを実行している場合や、ネットワーク上の他のコンピュータで作業成果を見せたい場合に便利)、次のように使用します。

python manage.py runserver 0.0.0.0:8080

次に、LabEx VMの Web 8080 タブに切り替えると、同じ「おめでとう」ページが表示されます。

Django development server page

開発サーバーの完全なドキュメントは、runserver のリファレンスで見つけることができます。

runserver の自動リロード
開発サーバーは、必要に応じて各リクエストごとにPythonコードを自動的に再読み込みします。コードの変更が反映されるようにサーバーを再起動する必要はありません。ただし、ファイルの追加などの一部の操作は再起動をトリガーしません。この場合、サーバーを再起動する必要があります。

投票アプリケーションの作成

これで、「プロジェクト」と呼ばれる環境がセットアップされましたので、作業を始める準備が整いました。

Djangoで書く各アプリケーションは、特定の規約に従ったPythonパッケージで構成されます。Djangoには、アプリケーションの基本的なディレクトリ構造を自動生成するユーティリティが付属しているため、ディレクトリを作成することよりもコードの記述に集中することができます。

プロジェクトとアプリケーションの違い
プロジェクトとアプリケーションの違いは何でしょうか?アプリケーションは、何かを行うWebアプリケーションです。たとえば、ブログシステム、公開記録のデータベース、または小さな投票アプリケーションなどです。プロジェクトは、特定のWebサイトの設定とアプリケーションのコレクションです。プロジェクトには複数のアプリケーションが含まれる場合があります。アプリケーションは複数のプロジェクトに含まれる場合があります。

あなたのアプリケーションは、Pythonパス<tut-searchpath>上のどこにでも配置できます。このチュートリアルでは、投票アプリケーションをmanage.pyファイルと同じディレクトリに作成します。これにより、それ自体のトップレベルモジュールとしてインポートできるようになり、mysiteのサブモジュールではなくなります。

アプリケーションを作成するには、manage.pyと同じディレクトリにいることを確認して、次のコマンドを入力します。

cd ~/project/mysite
python manage.py startapp polls

これにより、pollsというディレクトリが作成され、以下のような構成になっています。

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

このディレクトリ構造に投票アプリケーションが配置されます。

最初のビューを書く

最初のビューを書いてみましょう。polls/views.py ファイルを開き、次のPythonコードを入力します。

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

これはDjangoで可能な最もシンプルなビューです。ビューを呼び出すには、それをURLにマッピングする必要があります。このためにはURLconfが必要です。

投票アプリケーションのディレクトリにURLconfを作成するには、urls.py という名前のファイルを作成します。アプリケーションのディレクトリは次のようになります。

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

polls/urls.py ファイルに次のコードを記述します。

from django.urls import path

from. import views

urlpatterns = [
    path("", views.index, name="index"),
]

次のステップは、ルートURLconfを polls.urls モジュールに向けることです。mysite/urls.py で、django.urls.include のインポートを追加し、urlpatterns リストに ~django.urls.include を挿入します。このようになります。

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("polls/", include("polls.urls")),
    path("admin/", admin.site.urls),
]

~django.urls.include 関数は、他のURLconfを参照するために使用します。Djangoが ~django.urls.include に遭遇すると、その時点までに一致したURLの部分を切り捨て、残りの文字列を含まれるURLconfに送り、さらなる処理を行います。

~django.urls.include の背後にある考え方は、URLを簡単にプラグアンドプレイできるようにすることです。投票アプリケーションは独自のURLconf(polls/urls.py)にあるため、/polls/ の下、/fun_polls/ の下、/content/polls/ の下、またはその他の任意のパスルートの下に配置でき、アプリケーションは依然として機能します。

~django.urls.include() を使用するタイミング
他のURLパターンを含める場合、常に include() を使用する必要があります。このルールの唯一の例外は admin.site.urls です。

これで、index ビューがURLconfに接続されました。次のコマンドでそれが正常に動作することを確認します。

python manage.py runserver 0.0.0.0:8080

ブラウザで <http:///polls/> にアクセスすると、index ビューで定義した "Hello, world. You're at the polls index." というテキストが表示されるはずです。

Django URLconf structure

~django.urls.path 関数には4つの引数が渡されます。必須の引数は2つで、routeview です。オプションの引数も2つで、kwargsname です。この時点で、これらの引数が何のためのものかを見直しておく価値があります。

~django.urls.path 引数: route

route はURLパターンを含む文字列です。リクエストを処理する際、Djangoは urlpatterns の最初のパターンから始まり、リストを下に向かって進み、要求されたURLと各パターンを比較して、一致するものが見つかるまで続けます。

パターンはGETやPOSTパラメータ、ドメイン名を検索しません。たとえば、https://www.example.com/myapp/ へのリクエストでは、URLconfは myapp/ を探します。https://www.example.com/myapp/?page=3 へのリクエストでも、URLconfは myapp/ を探します。

~django.urls.path 引数: view

Djangoが一致するパターンを見つけると、指定されたビュー関数に ~django.http.HttpRequest オブジェクトを第1引数として、ルートからの任意の「キャプチャされた」値をキーワード引数として渡して呼び出します。この例については少し後で説明します。

~django.urls.path 引数: kwargs

任意のキーワード引数を辞書形式で対象のビューに渡すことができます。このチュートリアルではDjangoのこの機能を使用しません。

~django.urls.path 引数: name

URLに名前を付けることで、Django内の他の場所、特にテンプレート内から明確に参照できるようになります。この強力な機能により、プロジェクトのURLパターンをグローバルに変更する際に、単一のファイルのみを編集すれば済むようになります。

まとめ

おめでとうございます!基本的な投票アプリケーションの作成の実験を完了しました。LabExでさらに多くの実験を行って、技術力を向上させることができます。