手順 6: ポーリング Django Web プロジェクト テンプレートを使用するStep 6: Use the Polls Django Web Project template

前の手順: Django でユーザーを認証するPrevious step: Authenticate users in Django

Visual Studio の "Django Web Project" テンプレートについて理解したので、3 つ目の Django テンプレートである "ポーリング Django Web プロジェクト" について見てみましょう。これは同じコード ベースに基づいて構築されており、データベースの使用例がわかるテンプレートです。Having understood Visual Studio's "Django Web Project" template, you can now look at the third Django template, "Polls Django Web Project", which builds upon the same code base and demonstrates working with a database.

この手順では、次の方法を学習します。In this step you learn how to:

  • テンプレートからプロジェクトを作成し、データベースを初期化する (手順 6-1)Create a project from the template and initialize the database (step 6-1)
  • データ モデルを理解する (手順 6-2)Understand data models (step 6-2)
  • 移行を適用する (手順 6-3)Apply migrations (step 6-3)
  • プロジェクト テンプレートによって作成されたビューとページ テンプレートを理解する (手順 6-4)Understand the views and page templates created by the project template (step 6-4)
  • カスタム管理インターフェイスを作成する (手順 6-5)Create a custom administration interface (step 6-5)

このテンプレートを使用して作成されるプロジェクトは、Django ドキュメントの「Writing your first Django app」(最初の Django アプリを作成する) チュートリアルに従った場合のプロジェクトと似ています。この Web アプリは、ユーザーが投票を表示し、投票することができるパブリック サイトと、投票を管理できる管理インターフェイスから構成されています。A project created using this template is similar to what you get by following the Writing your first Django app tutorial in the Django docs. The web app consists of a public site that lets people view polls and vote in them, along with a custom administrative interface through which you can manage polls. 以下のセクションで説明するように、"Django Web プロジェクト" テンプレートと同じ認証システムを使用し、Django モデルを実装してデータベースをより活用しています。It uses the same authentication system as the "Django Web Project" template and makes more use of the database by implementing Django models as explored in the following sections.

手順 6-1: プロジェクトを作成し、データベースを初期化するStep 6-1: Create the project and initialize the database

  1. Visual Studio で、ソリューション エクスプローラーに移動して、このチュートリアルで以前に作成した LearningDjango ソリューションを右クリックし、[追加] > [新しいプロジェクト] を選択します In Visual Studio, go to Solution Explorer, right-click the LearningDjango solution created earlier in this tutorial, and select Add > New Project. (または、新しいソリューションを使用する場合は、代わりに [ファイル] > [新規] > [プロジェクト] の順に選択します)。(Alternately, if you want to use a new solution, select File > New > Project instead.)

  2. [新しいプロジェクト] ダイアログで Django ポーリング Web プロジェクト テンプレートを探して選択し、[OK] を選択します。In the new project dialog, search for and select the Polls Django Web Project template, call the project "DjangoPolls", and select OK.

  3. Visual Studio の他のプロジェクト テンプレートと同様に、"ポーリング Django Web プロジェクト" テンプレートには requirements.txt ファイルが含まれており、Visual Studio ではこれらの依存関係のインストール先を確認するメッセージが表示されます。Like the other project templates in Visual Studio, the "Polls Django Web Project" template includes a requirements.txt file, Visual Studio prompts asks where to install those dependencies. オプションを選択し、仮想環境にインストールして、[仮想環境の追加] ダイアログで [作成] を選択して、既定値を受け入れます。Choose the option, Install into a virtual environment, and in the Add Virtual Environment dialog select Create to accept the defaults.

  4. Python による仮想環境の設定が終了したら、readme.html に表示された指示に従って、データベースを初期化し、Django スーパー ユーザー (つまり、管理者) を作成します。Once Python finishes setting up the virtual environment, follow the instructions in the displayed readme.html to initialize the database and create a Django super user (that is, an administrator). そのために、まずソリューション エクスプローラーDjangoPolls プロジェクトを右クリックし、[Python] > [Django 移行] コマンドを選択し、もう一度プロジェクトを右クリックして [Python] > [Django でスーパー ユーザーを作成する] コマンドを選択し、プロンプトに従います The steps are to first right-click the DjangoPolls project in Solution Explorer, select the Python > Django Migrate command, then right-click the project again, select the Python > Django Create Superuser command, and follow the prompts. (初めてスーパー ユーザーを作成する場合、データベースが初期化されていないため、エラーが表示されます)。(If you try to create a super user first, you'll see an error because the database has not been initialized.)

  5. ソリューション エクスプローラーを右クリックし、[スタートアップ プロジェクトに設定] を選択して、DjangoPolls プロジェクトを Visual Studio ソリューションの既定に設定します。Set the DjangoPolls project to be the default for the Visual Studio solution by right-clicking that project in Solution Explorer and selecting Set as Startup Project. デバッガーを起動すると、太字で表示されているスタートアップ プロジェクトが実行されます。The startup project, which is shown in bold, is what's run when you start the debugger.

  6. [デバッグ] > [デバッグの開始] (F5 キー) を選択するか、またはツールバーの [Web サーバー] ボタンを使用して、サーバーを実行します。Select Debug > Start Debugging (F5) or use the Web Server button on the toolbar to run the server:

    Visual Studio の [Web サーバー] ツールバー ボタンを実行する

  7. テンプレートで作成したアプリには [ホーム]、[詳細]、[連絡先] という 3 つのページがあり、上部のナビゲーション バーを使用して各ページ間を移動できます。The app created by the template has three pages, Home, About, and Contact, which you navigate between using the top nav bar. 1、2 分とって、アプリのさまざまな部分を確認してみましょう ([詳細] ページと [連絡先] ページは Django Web プロジェクトとよく似ていますが、ここでは詳しく説明しません)。Take a minute or two to examine different parts of the app (the About and Contact pages are very similar to the "Django Web Project" and aren't discussed further).

    ポーリング Django Web プロジェクト アプリの全体的なブラウザー ビュー

  8. また、ナビゲーション バーの [管理] リンクを選択すると、ログイン画面が表示され、認証された管理者のみが管理インターフェイスを使用できることが示されます。Also select the Administration link in the nav bar, which displays a login screen to demonstrate that the administrative interface is authorized only to authenticated administrators. スーパー ユーザーの資格情報を使用すると、このプロジェクト テンプレートを使用するときに既定で有効になっている "/admin" ページにルーティングされます。Use the super user credentials and you're routed to the "/admin" page, which is enabled by default when using this project template.

    ポーリング Django Web プロジェクト アプリの管理ビュー

  9. 以降のセクションについては、アプリにそのまま実行させることができます。You can leave the app running for the sections that follow.

    アプリを停止してソース コントロールへの変更をコミットする場合、最初にチーム エクスプローラー[変更] を開き、仮想環境のフォルダー (通常は env) を右クリックして、[これらのローカル項目を無視] を選択します。If you want to stop the app and commit changes to source control, first open the Changes page in Team Explorer, right-click the folder for the virtual environment (probably env), and select Ignore these local items.

プロジェクトの内容を確認するExamine the project contents

前述のように、As noted before. Visual Studio で他のプロジェクト テンプレートを確認したことがある場合は、"ポーリング Django Web プロジェクト" テンプレートから作成されたプロジェクトの多くの部分は見慣れているはずです。much of what's in a project created from the "Polls Django Web Project" template should be familiar if you've explored the other project templates in Visual Studio. この記事の追加手順では、データ モデルや追加のビューなど、より重要な変更や追加についてまとめています。The additional steps in this article summarize the more significant changes and additions, namely data models and additional views.

質問: [Django 移行] は何を実行するコマンドですかQuestion: What does the Django Migrate command do?

回答: [Django 移行] コマンドは、具体的には manage.py migrate コマンドを実行します。これは、以前に実行されたことがないスクリプトが app/migrations フォルダー内にあれば実行するコマンドです。Answer: the Django Migrate command specifically runs the manage.py migrate command, which runs any scripts in the app/migrations folder that haven't been run previously. この例では、そのフォルダー内の 0001_initial.py スクリプトが実行され、データベース内の必要なスキーマが設定されます。In this case, the command runs the 0001_initial.py script in that folder to set up the necessary schema in the database.

移行スクリプト自体は manage.py makemigrations コマンドによって作成されます。このコマンドを実行すると、アプリの models.py ファイルがスキャンされ、データベースの現在の状態と比較され、現在のモデルに合うようにデータベース スキーマを移行するために必要なスクリプトが生成されます。The migration script itself is created by the manage.py makemigrations command, which scans the app's models.py file, compares it to the current state of the database, and then generates the necessary scripts to migrate the database schema to match the current models. いずれはモデルを更新し、変更することになるので、この Django の機能は非常に強力です。This feature of Django is very powerful as you update and modify your models over time. 移行を生成して実行することで、モデルとデータベースの同期状態を簡単に維持することができます。By generating and running migrations, you keep the models and the database in sync with little difficulty.

移行は、この記事で後述する手順 6-3 で使用します。You work with a migration in step 6-3 later in this article.

手順 6-2: データ モデルを理解するStep 6-2: Understand data models

このアプリのモデルである Poll と Choice は、app/models.py で定義されています。The models for the app, named Poll and Choice, are defined in app/models.py. 各モデルは django.db.models.Model から派生し、CharFieldIntegerField のような models クラスのメソッドを使用してモデル内のフィールドを定義する Python クラスです (これらのフィールドはデータベースの列にマップされます)。Each is a Python class that derives from django.db.models.Model and uses methods of the models class like CharField and IntegerField to define fields in the model, which map to database columns.

from django.db import models
from django.db.models import Sum

class Poll(models.Model):
    """A poll object for use in the application views and repository."""
    text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def total_votes(self):
        """Calculates the total number of votes for this poll."""
        return self.choice_set.aggregate(Sum('votes'))['votes__sum']

    def __unicode__(self):
        """Returns a string representation of a poll."""
        return self.text

class Choice(models.Model):
    """A poll choice object for use in the application views and repository."""
    poll = models.ForeignKey(Poll)
    text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def votes_percentage(self):
        """Calculates the percentage of votes for this choice."""
        total = self.poll.total_votes()
        return self.votes / float(total) * 100 if total > 0 else 0

    def __unicode__(self):
        """Returns a string representation of a choice."""
        return self.text

ご覧のように、Poll は text フィールドに説明を、pub_date に公開日を保持します。As you can see, a Poll maintains a description in its text field and a publication date in pub_date. これらのフィールドは、データベース内の Poll のためにのみ存在するフィールドです。total_votes フィールドは実行時に計算されます。These fields are the only ones that exist for the Poll in the database; the total_votes field is calculated at runtime.

Choice は poll フィールドを介して Poll と関連しており、text には説明が含まれ、votes には選択肢の数が保持されます。A Choice is related to a Poll through the poll field, contains a description in text, and maintains a count for that choice in votes. votes_percentage フィールドは実行時に計算され、データベース内には存在しません。The votes_percentage field is calculated at runtime and is not found in the database.

フィールドの種類をすべて挙げると、CharField (制限ありのテキスト) TextField (無制限のテキスト)、EmailFieldURLFieldDateTimeFieldIntegerFieldDecimalFieldBooleanFieldForeignKey、および ManyToMany があります。The full list of field types is CharField (limited text) TextField (unlimited text), EmailField, URLField, DateTimeField, IntegerField, DecimalField, BooleanField, ForeignKey, and ManyToMany. 各フィールドには、max_length のような属性があります。Each field takes some attributes, like max_length. blank=True 属性はフィールドが省略可能であることを意味します。null=true は値が省略可能であることを意味します。The blank=True attribute means the field is optional; null=true means that a value is optional. 値を、データ値または表示値タプルの配列に含まれる値に制限する choices 属性もあります There is also a choices attribute that limits values to values in an array of data value/display value tuples. (Django ドキュメントの「Model field reference」(Model フィールド リファレンス) を参照してください)。(See the Model field reference in the Django documentation.)

SQLite ブラウザーのようなツールを使用してプロジェクトの db.sqlite3 ファイルを調べることで、データベースに保存されている内容を正確に確認することができます。You can confirm exactly what's stored in the database by examining the db.sqlite3 file in the project using a tool like the SQLite browser. データベース内には、Choice モデルの poll のような外部キー フィールドが poll_id として格納されていることがわかります。Django はこのマッピングを自動的に処理します。In the database, you see that a foreign key field like poll in the Choice model is stored as poll_id; Django handles the mapping automatically.

一般的に、Django でデータベースを操作するということは、Django がユーザーの代わりに基のデータベースを管理できるように、モデルを介して排他的に操作することを意味します。In general, working with your database in Django means working exclusively through your models so that Django can manage the underlying database on your behalf.

samples.json からデータベースをシードするSeed the database from samples.json

最初は、データベースには投票が含まれていません。Initially, the database contains no polls. "/admin" URL の管理インターフェイスを使用して手動で投票を追加することができます。また、実行中のサイトの "/seed" ページにアクセスして、アプリの samples.json ファイルに定義されている投票でデータベースのシードを追加することもできます。You can use the administrative interface at the "/admin" URL to add polls manually, and you can also visit the "/seed" page on the running site to add seed the database with polls defined in the app's samples.json file.

Django プロジェクトの urls.py には追加の URL パターン url(r'^seed$', app.views.seed, name='seed'), があります。The Django project's urls.py has an added URL pattern, url(r'^seed$', app.views.seed, name='seed'),. app/views.pyseed ビューには samples.json ファイルが読み込まれ、必要なモデル オブジェクトが作成されます。The seed view in app/views.py loads the samples.json file and creates the necessary model objects. Django で、基のデータベース内の一致するレコードが自動的に作成されます。Django then automatically creates the matching records in the underlying database.

@login_required デコレーターを使用は、ビューの承認レベルを示すことに注意してください。Note the use of the @login_required decorator to indicate the authorization level for the view.

@login_required
def seed(request):
    """Seeds the database with sample polls."""
    samples_path = path.join(path.dirname(__file__), 'samples.json')
    with open(samples_path, 'r') as samples_file:
        samples_polls = json.load(samples_file)

    for sample_poll in samples_polls:
        poll = Poll()
        poll.text = sample_poll['text']
        poll.pub_date = timezone.now()
        poll.save()

        for sample_choice in sample_poll['choices']:
            choice = Choice()
            choice.poll = poll
            choice.text = sample_choice
            choice.votes = 0
            choice.save()

    return HttpResponseRedirect(reverse('app:home'))

影響を確認するために、まずアプリを実行して投票がまだ存在しないことを確認します。To see the effect, run the app first to see that no polls yet exist. 次に "/seed" URL にアクセスします。アプリがホーム ページに戻ると、投票を使用できるようになったことがわかります。Then visit the "/seed" URL, and when the app returns to the home page you should see that polls have become available. ここでも SQLite ブラウザーのようなツールを使って db.sqlite3 の生ファイルを調べてみてください。Again, feel free to examine the raw db.sqlite3 file with a tool like the SQLite browser.

シードされたデータベースを使用したポーリング Django Web プロジェクト アプリ

質問: Django 管理ユーティリティを使用してデータベースを初期化することはできますかQuestion: Is it possible to initialize the database using the Django administrative utility?

回答: はい。django-admin loaddata コマンドを使用して、アプリのシード処理ページと同じタスクを実行できます。Answer: Yes, you can use the django-admin loaddata command to accomplish the same task as the seeding page in the app. 完成した Web アプリ上で作業する場合は、2 つの方法を組み合わせて使用することができます。コマンド ラインからデータベースを初期化してから、ハードコーディングしたファイルに頼らずに他の任意の JSON に送信できる API にこのシード ページを変換するという方法です。When working on a full web app, you might use a combination of the two methods: initialize a database from the command line, then convert the seed page here to an API to which you can send any other arbitrary JSON rather than relying on a hard-coded file.

手順 6-3: 移行を使用するStep 6-3: Use migrations

プロジェクトの作成後に (Visual Studio のコンテキスト メニューを使用して) manage.py makemigrations コマンドを実行した場合、Django によってファイル app/migrations/0001_initial.py が作成されます。When you ran the manage.py makemigrations command (using the context menu in the Visual Studio) after creating the project, Django created the file app/migrations/0001_initial.py file. このファイルには、初期データベース テーブルを作成するスクリプトが含まれています。This file contains a script that creates the initial database tables.

いずれはモデルに変更を加えることになるので、Django でこれらのモデルを使用すると、基のデータベース スキーマを簡単に最新の状態に保つことができます。Because you'll inevitably make changes to your models over time, Django makes it easy to keep the underlying database schema up to date with those models. 一般的なワークフローは次のとおりです。The general workflow is as follows:

  1. models.py ファイルのモデルに変更を加えます。Make changes to the models in your models.py file.
  2. Visual Studio のソリューション エクスプローラーでプロジェクトを右クリックし、[Python] > [Django で移行を実行する] コマンドを選択します。In Visual Studio, right-click the project in Solution Explorer and select the Python > Django Make Migrations command. 前述のように、このコマンドは app/migrations にスクリプトを生成し、データベースを現在の状態から新しい状態に移行します。As described earlier, this command generates scripts in app/migrations to migrate the database from its current state to the new state.
  3. スクリプトを実際のデータベースに適用するには、もう一度プロジェクトを右クリックし、[Python] > [Django 移行] を選択します。To apply the scripts to the actual database, right-click the project again and select Python > Django Migrate.

Django では、移行コマンドの実行時に必要な移行が適用されるように、各データベースに適用された移行が追跡されます。Django tracks which migrations have been applied to any given database, such that when you run the migrate command, Django applies whichever migrations are needed. たとえば、新しい空のデータベースを作成する場合、移行コマンドを実行すると、すべての移行スクリプトが適用され、現在のモデルを使用して最新の状態になります。If you create a new, empty database, for example, running the migrate command brings it up to date with your current models by applying every migration script. 同様に、開発用コンピューター上で複数のモデルを変更し、移行を生成する場合は、運用サーバー上で移行コマンドを実行して、累積的な移行を運用データベースに適用することができます。Similarly, if you make multiple model changes and generate migrations on a development computer, you can then apply the cumulative migrations to your production database by running the migrate command on your production server. Django は、運用データベースの最後の移行以降に生成された移行スクリプトのみを改めて適用します。Django again applies only those migration scripts that have been generated since the last migration of the production database.

モデルの変更の影響を確認するには、次の手順を実行します。To see the effect of changing a model, try the following steps:

  1. pub_date フィールドの後に次の行を追加して、app/models.py の Poll モデルに省略可能な author フィールドを追加します。Add an optional author field to the Poll model in app/models.py by adding the following line after the pub_date field to add an optional author field:

    author = models.CharField(max_length=100, blank=True)
    
  2. ファイルを保存し、ソリューション エクスプローラーDjangoPolls プロジェクトを右クリックし、[Python] > [Django で移行を実行する] コマンドを選択します。Save the file, then right-click the DjangoPolls project in Solution Explorer and select the Python > Django Make Migrations command.

  3. [プロジェクト] > [すべてのファイルを表示] コマンドを選択すると、migrations フォルダーに名前が 002_auto_ で始まる新しく生成されたスクリプトが表示されます。Select the Project > Show All Files command to see the newly generated script in the migrations folder, whose name starts with 002_auto_. ファイルを右クリックし、[プロジェクトに含める] を選択します。Right-click that file and select Include In Project. もう一度 [プロジェクト] > [すべてのファイルを表示] コマンドを選択すると、元のビューに戻ります You can then select Project > Show All Files again to restore the original view. (この手順の詳細については、以下の 2 つ目の質問を参照してください)。(See the second question below for details on this step.)

  4. 必要に応じてそのファイルを開き、Django によって以前のモデル状態から新しい状態への変更がどのようにスクリプト化されたかを確認します。If desired, open that file to examine how Django scripts the change from the previous model state to the new state.

  5. もう一度 Visual Studio プロジェクトを右クリックし、[Python] > [Django 移行] を選択して変更をデータベースに適用します。Right-click the Visual Studio project again and select Python > Django Migrate to apply the changes to the database.

  6. 必要に応じて、適切なビューアーでデータベースを開いて変更を確認します。If desired, open the database in an appropriate viewer to confirm the change.

全体的に見ると、Django の移行機能があれば、データベース スキーマを手動で管理する必要がないことがわかります。Overall, Django's migration feature means that you need never manage your database schema manually. モデルを変更し、移行スクリプトを生成し、移行コマンドを使用して適用するだけで済みます。Just make changes to your models, generate the migration scripts, and apply them with the migrate command.

質問: モデルを変更した後で移行コマンドを実行し忘れた場合はどうなりますかQuestion: What happens if I forget to run the migrate command after making changes to models?

回答: モデルがデータベースの内容と一致しない場合、実行時に適切な例外がスローされ、Django は失敗します。Answer: If the models don't match what's in the database, Django fails at runtime with appropriate exceptions. たとえば、前のセクションで示したモデルの変更を移行し忘れた場合、no such column: app_poll.author というエラーが表示されます。For example, if you forget to migrate the model change shown in the previous section, you see an error no such column: app_poll.author:

モデルの変更が移行されなかったときに表示されるエラーである必要があります。.

質問: [Django で移行を実行する] を実行した後、ソリューション エクスプローラーに新しく生成されたスクリプトが表示されないのはなぜですかQuestion: Why doesn't Solution Explorer show newly generated scripts after running Django Make Migrations?

回答: 新しく生成されたスクリプトは app/migrations フォルダーにあり、[Django 移行] コマンドを実行すると適用されますが、Visual Studio プロジェクトに追加されていないので、自動的にはソリューション エクスプローラーに表示されません。Answer: Although newly generated scripts exist in the app/migrations folder and are applied when running the Django Migrate command, they don't appear automatically in Solution Explorer because they've not been added to the Visual Studio project. 表示するには、まず [プロジェクト] > [すべてのファイルを表示] メニュー コマンドまたは次の図で示されているツール バーのボタンを選択します。To make them visible, first select the Project > Show All Files menu command or the toolbar button outlined in the image below. このコマンドを実行すると、ソリューション エクスプローラーにプロジェクト フォルダー内のすべてのファイルが表示されます。そのプロジェクトに追加されていない項目には、輪郭が点線のアイコンが使用されます。This command causes Solution Explorer to show all files in the project folder, using a dotted outline icon for items that haven't been added to the project itself. 追加するファイルを右クリックし、[プロジェクトに含める] を選択します。こうすると、次回のコミットでソース管理にも含まれます。Right-click the files you want to add and select Include In Project, which also includes them in source control with your next commit.

ソリューション エクスプローラーの [プロジェクトに含める] コマンド

質問: 移行コマンドを実行する前に、どのような移行が適用されるかを確認できますかQuestion: Can I see what migrations would be applied before running the migrate command?

回答: はい。django-admin showmigrations コマンドを使用してください。Answer: Yes, use the django-admin showmigrations command.

手順 6-4: プロジェクト テンプレートによって作成されたビューとページ テンプレートを理解するStep 6-4: Understand the views and page templates created by the project template

"ポーリング Django Web プロジェクト" テンプレートで生成されるビュー ([詳細] ページや [連絡先] ページのビューなど) のほとんどは、このチュートリアルで使用した "Django Web プロジェクト" テンプレートによって作成されるビューとよく似ています。Most of the views generated by the "Polls Django Web Project" template, such as the views for the About and Contact pages, are quite similar to views created by the "Django Web Project" template you worked with earlier in this tutorial. ポーリング アプリの違いは、ホーム ページでモデルを利用している点と、投票を実行し、投票結果を表示するためのページがいくつか追加されている点です。What's different in the Polls app is that its home page makes use of the models, as do several added pages for voting and viewing poll results.

まず、Django プロジェクトの urls.py ファイル内にある urlpatterns 配列の最初の行は、単なるアプリ ビューへのルーティングではなく、To begin with, the first line in the Django project's urlpatterns array in urls.py file is more than just a simple routing to an app view. アプリ固有の urls.py ファイルを取得します。Instead, it pulls in the app's own urls.py file:

from django.conf.urls import url, include
import app.views

urlpatterns = [
    url(r'^', include('app.urls', namespace="app")),
    # ..
]

app/urls.py ファイルには、さらに興味深いルーティング コードがあります (説明コメントが追加されています)。The app/urls.py file then contains some more interesting routing code (explanatory comments added):

urlpatterns = [
    # Home page routing
    url(r'^$',
        app.views.PollListView.as_view(
            queryset=Poll.objects.order_by('-pub_date')[:5],
            context_object_name='latest_poll_list',
            template_name='app/index.html',),
        name='home'),

    # Routing for a poll page, which use URLs in the form <poll_id>/,
    # where the id number is captured as a group named "pk".
    url(r'^(?P<pk>\d+)/$',
        app.views.PollDetailView.as_view(
            template_name='app/details.html'),
        name='detail'),

    # Routing for <poll_id>/results pages, again using a capture group
    # named pk.
    url(r'^(?P<pk>\d+)/results/$',
        app.views.PollResultsView.as_view(
            template_name='app/results.html'),
        name='results'),

    # Routing for <poll_id>/vote pages, with the capture group named
    # poll_id this time, which becomes an argument passed to the view.
    url(r'^(?P<poll_id>\d+)/vote/$', app.views.vote, name='vote'),
]

ここで使用されている複雑な正規表現に慣れていない場合は、正規表現を regex101.com に貼り付けて、わかりやすい説明を確認することができます If you're not familiar with the more complex regular expressions used here, you can paste the expression into regex101.com for an explanation in plain language. (スラッシュ / をエスケープするには、その前にバック スラッシュ \ を追加する必要があります。Python では、文字列に "raw (生)" を意味する r プレフィックスがあるため、エスケープする必要はありません)。(You'll need to escape the forward slashes / by adding a back slash, \ before them; escaping isn't necessary in Python because of the r prefix on the string, meaning "raw").

Django では、構文 ?P<name>patternname というグループが作成されます。これは出現順でビューの引数として渡されます。In Django, the syntax ?P<name>pattern creates a group named name, which gets passed as arguments to views in the order they appear. 前述のコードでは、PollsDetailViewPollsResultsViewpk という引数を受け取り、app.views.votepoll_id という引数を受け取ります。In the code shown earlier, PollsDetailView and PollsResultsView receive an argument named pk and app.views.vote receives an argument named poll_id.

また、ほとんどのビューは app/views.py のビュー関数に対する直接参照ではありません。You can also see that most of the views are not just direct references to a view function in app/views.py. ほとんどは django.views.generic.ListView または django.views.generic.DetailView から派生した同じファイル内のクラスを参照していることがわかります。Instead, most refer to a class in that same file that derives from django.views.generic.ListView or django.views.generic.DetailView. 基底クラスには as_view メソッドがあります。このメソッドは、テンプレートを識別する template_name 引数を受け取ります。The base classes provide the as_view methods, which take a template_name argument to identify the template. ListView 基底クラスは、ホーム ページに使用されます。この基底クラスには、データを含む queryset プロパティと、テンプレート内のデータを参照する変数名 (この場合は latest_poll_list) が指定された context_object_name プロパティも必要です。The ListView base class, as used for the home page, also expects a queryset property containing the data and a context_object_name property with the variable name by which you want to refer to the data in the template, in this case latest_poll_list.

ホーム ページの PollListView を確認できるようになりました。これは、app/views.py で次のように定義されています。Now you can examine the PollListView for the home page, which is defined as follows in app/views.py:

class PollListView(ListView):
    """Renders the home page, with a list of all polls."""
    model = Poll

    def get_context_data(self, **kwargs):
        context = super(PollListView, self).get_context_data(**kwargs)
        context['title'] = 'Polls'
        context['year'] = datetime.now().year
        return context

ここでは、ビューが使用するモデル (Poll) を特定し、get_context_data メソッドをオーバーライドして titleyear の値をコンテキストに追加する処理が行われています。All that's done here is to identify the model that the view works with (Poll), and overrides the get_context_data method to add title and year values to the context.

テンプレート (templates/app/index.html) の中心部分は次のとおりです。The core of the template (templates/app/index.html) is as follows:

{% if latest_poll_list %}
<table class="table table-hover">
    <tbody>
        {% for poll in latest_poll_list %}
        <tr>
            <td>
                <a href="{% url 'app:detail' poll.id %}">{{poll.text}}</a>
            </td>
        </tr>
        {% endfor %}
    </tbody>
</table>
{% else %}
<!-- ... other content omitted ... -->
{% endif %}

簡単に説明すると、このテンプレートは latest_poll_list で Poll オブジェクトのリストを受け取り、そのリストに対して、投票の text 値を使用して各投票のリンクを含むテーブル行を作成する反復処理を実行しています。Put simply, the template receives the list of Poll objects in latest_poll_list, and then iterates through that list to create a table row that contains a link to each poll using the poll's text value. {% url %} タグの "app:detail" は、引数として poll.id を使用する、"detail" という app/urls.py の URL パターンを指します。In the {% url %} tag, "app:detail" refers to the url pattern in app/urls.py named "detail", using poll.id as an argument. この結果、Django では適切なパターンを使用して URL が作成され、それがリンクに使用されます。The effect of this is that Django creates a URL using the appropriate pattern and uses that for the link. つまり、今後は、この URL パターンをいつでも変更できます。また、生成されるリンクは、変更に合わせて自動的に更新されます。This bit of future-proofing means that you can change that URL pattern at any time and the generated links automatically update to match.

app/views.pyPollDetailView クラスと PollResultsView クラス (ここには示されていません) は、代わりに DetailView から派生している点を除いて PollListView とほとんど同じです。The PollDetailView and PollResultsView classes in app/views.py (not shown here) look almost identical to PollListView except that they derive from DetailView instead. それぞれのテンプレート app/templates/details.htmlapp/templates/results.html は、さまざまな HTML コントロール内のモデルから適切なフィールドを配置します。Their respective templates, app/templates/details.html and app/templates/results.html then place the appropriate fields from the models within various HTML controls. details.html に独自の点の 1 つは、送信時に /vote URL に対して POST が実行される HTML フォーム内に、投票の選択肢が含まれていることです。One unique piece in details.html is that the choices for a poll are contained within an HTML form that when submitted does a POST to the /vote URL. 前述のように、この URL パターンは app.views.vote にルーティングされます。これは次のように実装されます (ここでも、poll_id 引数は、このビューのルーティングで使用される正規表現の名前付きグループです)。As seen earlier, that URL pattern is routed to app.views.vote, which is implemented as follows (note the poll_id argument, which is again a named group in the regular expression used in the routing for this view):

def vote(request, poll_id):
    """Handles voting. Validates input and updates the repository."""
    poll = get_object_or_404(Poll, pk=poll_id)
    try:
        selected_choice = poll.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'app/details.html', {
            'title': 'Poll',
            'year': datetime.now().year,
            'poll': poll,
            'error_message': "Please make a selection.",
    })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('app:results', args=(poll.id,)))

この例では、ビューには他のページのような固有の対応するテンプレートがありません。Here, the view doesn't have its own corresponding template like the other pages. 代わりに、選択された投票を検証し、(誰かが "vote/1a2b3c" のような URL を入力した場合に備えて) 投票が存在しない場合に 404 を表示します。Instead, it validates the selected poll, showing a 404 if the poll doesn't exist (just in case someone enters a URL like "vote/1a2b3c"). 次に、投票した選択肢がその投票で有効であることを確認します。It then makes sure the voted choice is valid for the poll. 有効でない場合、except ブロックはエラー メッセージが記載された詳細ページを改めて表示します。If not, the except block just renders the details page again with an error message. 選択肢が有効な場合、ビューに投票が集計され、結果ページにリダイレクトされます。If the choice is valid, then the view tallies the vote and redirects to the results page.

手順 6-5: カスタム管理インターフェイスを作成するStep 6-5: Create a custom administration interface

"ポーリング Django Web プロジェクト" テンプレートの最後の部分は、この記事の手順 6-1 で説明したように、既定の Django 管理インターフェイスのカスタム拡張です。The last pieces of the "Polls Django Web Project" template are custom extensions to the default Django administrative interface, as shown earlier in this article under step 6-1. ユーザーとグループの管理用に既定のインターフェイスが用意されていますが、それ以上の機能はありません。The default interface provides for user and group management, but nothing more. ポーリング プロジェクト テンプレートでは、投票も管理できる機能を追加しています。The Polls project template adds features that allow you to manage polls as well.

まず、Django プロジェクトの urls.py の URL パターンには、既定で url(r'^admin/', include(admin.site.urls)), が含まれています。"admin/doc" パターンもコメント アウトされた状態で含まれています。First of all, the URL patterns in the Django project's urls.py has url(r'^admin/', include(admin.site.urls)), included by default; the "admin/doc" pattern is also included but commented out.

このアプリには admin.py ファイルが含まれています。settings.pyINSTALLED_APPS 配列に django.contrib.admin が含まれているため、管理インターフェイスにアクセスしたときに、このファイルは Django によって自動的に実行されます。The app then contains the file admin.py, which Django automatically runs when you visit the administrative interface thanks to the inclusion of django.contrib.admin in the INSTALLED_APPS array of settings.py. プロジェクト テンプレートに含まれているこのファイルのコードは次のとおりです。The code in that file, as provided by the project template, is as follows:

from django.contrib import admin
from app.models import Choice, Poll

class ChoiceInline(admin.TabularInline):
    """Choice objects can be edited inline in the Poll editor."""
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    """Definition of the Poll editor."""
    fieldsets = [
        (None, {'fields': ['text']}),
        ('Date information', {'fields': ['pub_date']}),
    ]
    inlines = [ChoiceInline]
    list_display = ('text', 'pub_date')
    list_filter = ['pub_date']
    search_fields = ['text']
    date_hierarchy = 'pub_date'

admin.site.register(Poll, PollAdmin)

ご覧のように、PollAdmin クラスは django.contrib.admin.ModelAdmin から派生し、管理する Poll モデルの名前を使用して複数のフィールドをカスタマイズします。As you can see, the PollAdmin class derives from django.contrib.admin.ModelAdmin and customizes a number of its fields using names from the Poll model, which it manages. これらのフィールドについては、Django ドキュメントの「ModelAdmin options」(ModelAdmin のオプション) を参照してください。These fields are described on ModelAdmin options in the Django documentation.

admin.site.register を呼び出すと、そのクラスはモデル (Poll) に接続され、管理インターフェイスに追加されます。The call to admin.site.register then connects that class to the model (Poll) and includes it on the admin interface. 全体的な結果は次のとおりです。The overall result is shown below:

ポーリング Django Web プロジェクト アプリの管理ビュー

次の手順Next steps

Note

このチュートリアルの途中で Visual Studio ソリューションをソース コード管理にコミットした場合は、もう 1 つのコミットを実行することをお勧めします。If you've been committing your Visual Studio solution to source control throughout the course of this tutorial, now is a good time to do another commit. ソリューションは、GitHub Microsoft/python-sample-vs-learning-django のチュートリアル ソース コードと一致するようにします。Your solution should match the tutorial source code on GitHub: Microsoft/python-sample-vs-learning-django.

Visual Studio で "空の Django Web プロジェクト"、"Django Web プロジェクト"、"ポーリング Django Web プロジェクト" の各テンプレートを全体的に確認しました。You've now explored the entirety of the "Blank Django Web Project", "Django Web Project", and "Polls Django Web Project" templates in Visual Studio. ビューとテンプレートの使用方法など、Django のすべての基本を学習し、ルーティング、認証、データベース モデルの使用方法を確認しました。You've learned all the basics of Django such as using views and templates, and have explored routing, authentication, and using database models. これで、必要なビューとモデルがある独自の Web アプリを作成できるようになったはずです。You should now be able to create a web app of your own with any views and models that you need.

開発用コンピューター上で Web アプリを実行することは、アプリを顧客に提供するための単なる 1 つの手順です。Running a web app on your development computer is just one step in making the app available to your customers. 今後の手順には、以下のようなタスクがあります。Next steps may include the following tasks:

  • Web アプリを Azure App Service などの運用サーバーに展開します。Deploy the web app to a production server, such as Azure App Service. Azure App Service に発行する」を参照してください。See Publish to Azure App Service.

  • templates/404.html というテンプレートを作成して、404 ページをカスタマイズします。Customize the 404 page by creating a template named templates/404.html. このテンプレートがある場合、Django は既定のテンプレートではなくこのテンプレートを使用します。When present, Django uses this template instead of its default one. 詳細については、Django ドキュメントの「Error views」(エラー ビュー) を参照してください。For more information, see Error views in the Django documentation.

  • tests.py で単体テストを作成します。Visual Studio プロジェクト テンプレートには、そのための出発点が用意されています。詳細については、Django ドキュメントの「Writing your first Django app, part 5 - testing」(最初の Django アプリを作成する、パート 5 - テスト) と「Testing in Django」(Django のテスト) を参照してください。Write unit tests in tests.py; the Visual Studio project templates provide starting points for these, and more information can be found on Writing your first Django app, part 5 - testing and Testing in Django in the Django documentation.

  • SQLite から、PostgreSQL、MySQL、SQL Server など (これらはいずれも Azure でホストできます) の運用レベルのデータ ストアにアプリを変更します。Change the app from SQLite to a production-level data store such as PostgreSQL, MySQL, and SQL Server (all of which can be hosted on Azure). When to use SQLite」(SQLite を使用する場合) (sqlite.org) で説明されているように、SQLite は、1 日あたり 100,000 ヒット未満のトラフィックが中小規模のサイトには適していますが、高ボリュームのサイトにはお勧めできません。As described on When to use SQLite (sqlite.org), SQLite works fine for low to medium traffic sites with fewer than 100K hits/day, but is not recommended for higher volumes. また、単一のコンピューターに制限されているため、負荷分散処理や geo レプリケーションなど、マルチサーバーのシナリオには使用できません。It's also limited to a single computer, so it cannot be used in any multi-server scenario such as load-balancing and geo-replication. 他のデータベースに対する Django のサポートについては、「Database setup」(データベースの設定) を参照してください。For information on Django's support for other databases, see Database setup. テーブルや BLOB のような Azure ストレージ サービスを使用する場合は、Azure SDK for Python も使用できます。You can also use the Azure SDK for Python to work with Azure storage services like tables and blobs.

  • Azure DevOps などのサービスに対して、継続的インテグレーション/継続的配置パイプラインを設定します。Set up a continuous integration/continuous deployment pipeline on a service like Azure DevOps. (Azure Repos、GitHub、または他の場所で) ソース コード管理を使用するだけでなく、リリースの前提条件として単体テストを自動的に実行するよう、Azure DevOps プロジェクトを構成することができます。また、運用環境にデプロイする前に、追加テストのためにステージング サーバーにデプロイするパイプラインを構成することもできます。In addition to working with source control (via Azure Repos or GitHub, or elsewhere), you can configure an Azure DevOps Project to automatically run your unit tests as a pre-requisite for release, and also configure the pipeline to deploy to a staging server for additional tests before deploying to production. さらに、Azure DevOps は App Insights などの監視ソリューションと統合されているので、アジャイル計画ツールを使用してサイクル全体に対応することができます。Azure DevOps, furthermore, integrates with monitoring solutions like App Insights and closes the whole cycle with agile planning tools. 詳細については、「Azure DevOps プロジェクトで Python 用の CI/CD パイプラインを作成する」、および一般的な Azure DevOps ドキュメントを参照してください。For more information, see Create a CI/CD pipeline for Python with the Azure DevOps project and also the general Azure DevOps documentation.