{"title":"Django の概要","version":"1.11","locale":"ja","docname":"intro/overview","url":"/ja/1.11/intro/overview/","canonical":"https://djangodocs.dev/ja/1.11/intro/overview/","summary":"Django は変転の激しいニュースルーム環境で開発された経緯から、よくある Web 開発タスクを迅速かつ簡単化するように設計されました。","html":"<h1>Django の概要<a class=\"heading-anchor\" href=\"#django-at-a-glance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django は変転の激しいニュースルーム環境で開発された経緯から、よくある Web 開発タスクを迅速かつ簡単化するように設計されました。ここでは Django による データベース中心の Web アプリケーション開発をざっと見てみましょう。</p>\n<p>このドキュメントの目的は、 Django の技術的な仕様について述べ、どのように動 作するかを理解してもらうことにあり、チュートリアルやリファレンス用ではあり ません。 (とはいえ、チュートリアルもリファレンスも別に用意していますよ！) プロジェクトを作成する準備ができたら、 <a class=\"reference internal\" href=\"/ja/1.11/intro/tutorial01/\"><span class=\"doc\">チュートリアルを始めれます</span></a> 。もしくは <a class=\"reference internal\" href=\"/ja/1.11/topics/\"><span class=\"doc\">より詳細なドキュメントを読む</span></a> こともできます。</p>\n<section id=\"design-your-model\">\n<h2>モデルの設計<a class=\"heading-anchor\" href=\"#design-your-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>データベースなしで Django を使うこともできますが、 Django には Python コードでデータベースのレイアウトを記述した <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Object-relational_mapping\">オブジェクトリレーショナルマッパー</a> (object-relational mapper) が付属しています。</p>\n<p><a class=\"reference internal\" href=\"/ja/1.11/topics/db/models/\"><span class=\"doc\">データモデル構文</span></a> ではモデルを表現するさまざまな方法が提供されています。これまでのところ、長年におけるデータベーススキーマの問題を解決してきた実績があります。 簡単な例を示しましょう:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>mysite/news/models.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"mysite/news/models.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Reporter</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    full_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">70</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>              <span class=\"c1\"># __unicode__ on Python 2</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>full_name\n\n<span class=\"k\">class</span> <span class=\"nc\">Article</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    pub_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n    headline <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    content <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n    reporter <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Reporter<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>              <span class=\"c1\"># __unicode__ on Python 2</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>headline\n</code></pre></figure>\n</section>\n<section id=\"install-it\">\n<h2>モデルのインストール<a class=\"heading-anchor\" href=\"#install-it\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>次に、データベーステーブルを自動でつくる Django のコマンドラインユーティリティを実行します:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py migrate\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/1.11/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a>  コマンドは利用できるモデルを探し出し、テーブルが既に存在していない場合にはデータベースにテーブルを作成し、必要に応じて <a class=\"reference internal\" href=\"/ja/1.11/topics/migrations/\"><span class=\"doc\">より強力なスキーマの制御</span></a> を提供します。</p>\n</section>\n<section id=\"enjoy-the-free-api\">\n<h2>自動生成される API で楽しむ<a class=\"heading-anchor\" href=\"#enjoy-the-free-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>これだけで、制約のない充実した <a class=\"reference internal\" href=\"/ja/1.11/topics/db/queries/\"><span class=\"doc\">Python API</span></a> を使っ て自分のデータにアクセスできます。API はオンザフライで生成され、コードを作 成する必要はありません:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"c1\"># Import the models we created from our &quot;news&quot; app</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">from</span> <span class=\"nn\">news.models</span> <span class=\"kn\">import</span> Reporter<span class=\"p\">,</span> Article\n\n<span class=\"c1\"># No reporters are in the system yet.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"o\">&lt;</span>QuerySet <span class=\"p\">[]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Create a new Reporter.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> r <span class=\"o\">=</span> Reporter<span class=\"p\">(</span>full_name<span class=\"o\">=</span><span class=\"s1\">&#39;John Smith&#39;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Save the object into the database. You have to call save() explicitly.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> r<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"c1\"># Now it has an ID.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> r<span class=\"o\">.</span>id\n<span class=\"mi\">1</span>\n\n<span class=\"c1\"># Now the new reporter is in the database.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"o\">&lt;</span>QuerySet <span class=\"p\">[</span><span class=\"o\">&lt;</span>Reporter<span class=\"p\">:</span> John Smith<span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Fields are represented as attributes on the Python object.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> r<span class=\"o\">.</span>full_name\n<span class=\"s1\">&#39;John Smith&#39;</span>\n\n<span class=\"c1\"># Django provides a rich database lookup API.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span>Reporter<span class=\"p\">:</span> John Smith<span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>full_name__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span>Reporter<span class=\"p\">:</span> John Smith<span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>full_name__contains<span class=\"o\">=</span><span class=\"s1\">&#39;mith&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span>Reporter<span class=\"p\">:</span> John Smith<span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\nTraceback <span class=\"p\">(</span>most recent call last<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\nDoesNotExist<span class=\"p\">:</span> Reporter matching query does <span class=\"ow\">not</span> exist<span class=\"o\">.</span>\n\n<span class=\"c1\"># Create an article.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> date\n<span class=\"o\">&gt;&gt;&gt;</span> a <span class=\"o\">=</span> Article<span class=\"p\">(</span>pub_date<span class=\"o\">=</span>date<span class=\"o\">.</span>today<span class=\"p\">(),</span> headline<span class=\"o\">=</span><span class=\"s1\">&#39;Django is cool&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>     content<span class=\"o\">=</span><span class=\"s1\">&#39;Yeah.&#39;</span><span class=\"p\">,</span> reporter<span class=\"o\">=</span>r<span class=\"p\">)</span>\n<span class=\"o\">&gt;&gt;&gt;</span> a<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"c1\"># Now the article is in the database.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"o\">&lt;</span>QuerySet <span class=\"p\">[</span><span class=\"o\">&lt;</span>Article<span class=\"p\">:</span> Django <span class=\"ow\">is</span> cool<span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Article objects get API access to related Reporter objects.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> r <span class=\"o\">=</span> a<span class=\"o\">.</span>reporter\n<span class=\"o\">&gt;&gt;&gt;</span> r<span class=\"o\">.</span>full_name\n<span class=\"s1\">&#39;John Smith&#39;</span>\n\n<span class=\"c1\"># And vice versa: Reporter objects get API access to Article objects.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> r<span class=\"o\">.</span>article_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"o\">&lt;</span>QuerySet <span class=\"p\">[</span><span class=\"o\">&lt;</span>Article<span class=\"p\">:</span> Django <span class=\"ow\">is</span> cool<span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># The API follows relationships as far as you need, performing efficient</span>\n<span class=\"c1\"># JOINs for you behind the scenes.</span>\n<span class=\"c1\"># This finds all articles by a reporter whose name starts with &quot;John&quot;.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>reporter__full_name__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span>QuerySet <span class=\"p\">[</span><span class=\"o\">&lt;</span>Article<span class=\"p\">:</span> Django <span class=\"ow\">is</span> cool<span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Change an object by altering its attributes and calling save().</span>\n<span class=\"o\">&gt;&gt;&gt;</span> r<span class=\"o\">.</span>full_name <span class=\"o\">=</span> <span class=\"s1\">&#39;Billy Goat&#39;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> r<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"c1\"># Delete an object with delete().</span>\n<span class=\"o\">&gt;&gt;&gt;</span> r<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house\">\n<h2>作業場 (scaffold) ではなく完成品 (whole house) の、動的な admin インタフェース<a class=\"heading-anchor\" href=\"#a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>モデルを定義したら、 Django は玄人向きの実運用に耐える <a class=\"reference internal\" href=\"/ja/1.11/ref/contrib/admin/\"><span class=\"doc\">管理インタフェー ス</span></a> を自動的に生成します。 このインタフェースは、認証をパスしたユーザがオブジェクトを追加、変更、削除できる Web サイトです。管理インタフェースの作成は簡単で、モデルクラスを admin サイトに追加するだけです:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>mysite/news/models.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"mysite/news/models.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Article</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    pub_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n    headline <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    content <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n    reporter <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Reporter<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>mysite/news/admin.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"mysite/news/admin.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n<span class=\"kn\">from</span> <span class=\"nn\">.</span> <span class=\"kn\">import</span> models\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>models<span class=\"o\">.</span>Article<span class=\"p\">)</span>\n</code></pre></figure>\n<p>サイトの編集はスタッフ、顧客、もしくはあなた自身の手で行われるものであり、 コンテンツの管理だけのためにバックエンドインタフェースを作りたくはない、という思想がここにはあります。</p>\n<p>作者たちが Django アプリケーションを作成するときの典型的なワークフローは、 モデルを作成し、 admin サイトを組み上げてできるだけ早期に立ち上げ、スタッフ (や顧客) がデータを投入できるようにしておいてから、データを公開するための方法を開発してゆくというものです。</p>\n</section>\n<section id=\"design-your-urls\">\n<h2>URL を設計する<a class=\"heading-anchor\" href=\"#design-your-urls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>すっきりとして洗練された URL スキームは、高品質な Web アプリケーションを実 現する上で重要な要素です。 Django は美しい URL の設計を助け、 <code class=\"docutils literal notranslate\">.php</code> や <code class=\"docutils literal notranslate\">.asp</code> のようなお粗末なゴミを URL に入れさせません。</p>\n<p>特定のアプリケーション用の URL を設計するには、<a class=\"reference internal\" href=\"/ja/1.11/topics/http/urls/\"><span class=\"doc\">URLconf</span></a> と呼ばれる Python モジュールを一つ作成します。 URLconf はいわばアプリケーションの目次にあたり、 URL のパターンを Python のコールバック関数に対応づけています。 URLconf はまた、 URL と Python コードを脱カップリングする働きも持っています。</p>\n<p><code class=\"docutils literal notranslate\">Reporter</code>/<code class=\"docutils literal notranslate\">Article</code> の例では、 URLconf は以下のようになります:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>mysite/news/urls.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"mysite/news/urls.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.conf.urls</span> <span class=\"kn\">import</span> url\n\n<span class=\"kn\">from</span> <span class=\"nn\">.</span> <span class=\"kn\">import</span> views\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    url<span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^articles/([0-9]</span><span class=\"si\">{4}</span><span class=\"s1\">)/$&#39;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>year_archive<span class=\"p\">),</span>\n    url<span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^articles/([0-9]</span><span class=\"si\">{4}</span><span class=\"s1\">)/([0-9]</span><span class=\"si\">{2}</span><span class=\"s1\">)/$&#39;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>month_archive<span class=\"p\">),</span>\n    url<span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^articles/([0-9]</span><span class=\"si\">{4}</span><span class=\"s1\">)/([0-9]</span><span class=\"si\">{2}</span><span class=\"s1\">)/([0-9]+)/$&#39;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>article_detail<span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>上のコードはシンプルな:ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>正規表現 &lt;regex-howto&gt;`と Python のコールバック関数(&quot;ビュー&quot;)をマッピングしています。正規表現は、 URL から値を取得するために括弧を用います。ユーザがページを要求すると、 Django はそれぞれのパターンを順番にチェックし、要求された URL に最初に一致したパターンで停止します。(もしそれらのどれとも一致しなかった時、 Django は特殊ケースである404ビューを呼び出します。)正規表現はロード時にコンパイルされるため、これらは非常に高速に動作します。</p>\n<p>正規表現の1つが一致すると、Djangoは与えられたビューを呼び出します。これはPythonの関数です。 各ビューは、リクエストのメタデータを含むリクエストオブジェクトと、正規表現で捉えられた値を渡します。</p>\n<p>例えば、ユーザが &quot;/articles/2005/05/39323/&quot; という URL をリクエストすると、 Django は <code class=\"docutils literal notranslate\">news.views.article_detail(request, '2005', '05', '39323')</code> のような関数呼び出しを行います。</p>\n</section>\n<section id=\"write-your-views\">\n<h2>ビューの自作<a class=\"heading-anchor\" href=\"#write-your-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>各ビュー (view) には二つの役割があります: 一つはリクエストされたページのコ ンテンツを含む <a class=\"reference internal\" href=\"/ja/1.11/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a> オブジェクトを返すこと、もう一つは <a class=\"reference internal\" href=\"/ja/1.11/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-class docutils literal notranslate\">Http404</code></a> のような例外の送出です。それ以外の処理はユーザ次第です。</p>\n<p>一般的に、ビューはパラメーターに従ってデータベースからデータを取り出し、テンプレートをロードして、取り出したデータでテンプレートをレンダリングします。 上の <code class=\"docutils literal notranslate\">year_archive</code> のビューを例に示しましょう:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>mysite/news/views.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"mysite/news/views.py\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Article\n\n<span class=\"k\">def</span> <span class=\"nf\">year_archive</span><span class=\"p\">(</span>request<span class=\"p\">,</span> year<span class=\"p\">):</span>\n    a_list <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span>year<span class=\"p\">)</span>\n    context <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;year&#39;</span><span class=\"p\">:</span> year<span class=\"p\">,</span> <span class=\"s1\">&#39;article_list&#39;</span><span class=\"p\">:</span> a_list<span class=\"p\">}</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s1\">&#39;news/year_archive.html&#39;</span><span class=\"p\">,</span> context<span class=\"p\">)</span>\n</code></pre></figure>\n<p>この例では Django の <a class=\"reference internal\" href=\"/ja/1.11/topics/templates/\"><span class=\"doc\">テンプレートシステム</span></a> を使っ ています。テンプレートシステムは、強力な機能をいくつも備えながらも、非プロ グラマが使いこなせる程度に簡単な仕組みです。</p>\n</section>\n<section id=\"design-your-templates\">\n<h2>テンプレートを設計する<a class=\"heading-anchor\" href=\"#design-your-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>上のコードでは <code class=\"docutils literal notranslate\">news/article_detail.html</code> という名前のテンプレートをロー ドしています。</p>\n<p>Django はテンプレートの重複を最小限にする為に、テンプレートの検索パスを持っています。Djangoの設定ファイルの中で、テンプレートをチェックする <a class=\"reference internal\" href=\"/ja/1.11/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\">DIRS</code></a> にディレクトリのリストを指定します。最初のディレクトリにテンプレートが存在しかった場合、2番目をチェックし、以降も同様にチェックが続きます。</p>\n<p>さて、 <code class=\"docutils literal notranslate\">news/year_archive.html</code> が見つかったとしましょう。テンプレートは以下のように書かれています:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code>mysite/news/templates/news/year_archive.html</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"mysite/news/templates/news/year_archive.html\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>Articles for <span class=\"cp\">{{</span> <span class=\"nv\">year</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>Articles for <span class=\"cp\">{{</span> <span class=\"nv\">year</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">article</span> <span class=\"k\">in</span> <span class=\"nv\">article_list</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">article.headline</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>By <span class=\"cp\">{{</span> <span class=\"nv\">article.reporter.full_name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>Published <span class=\"cp\">{{</span> <span class=\"nv\">article.pub_date</span><span class=\"o\">|</span><span class=\"nf\">date</span><span class=\"s2\">:&quot;F j, Y&quot;</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<p>変数は二重の波括弧で囲まれています。 <code class=\"docutils literal notranslate\">{{ article.headline }}</code> は、「article の headline という属性の出力」を表しています。とはいえ、ドット表記は属性の検索に使われるだけではありません。辞書の検索や、インデクス指定、関数呼び出しも行えます。</p>\n<p><code class=\"docutils literal notranslate\">{{ article.pub_date|date:&quot;F j, Y&quot; }}</code> で、 Unix スタイルの「パイプ」 (文字 “|”) を使っていることに注意して下さい。これはテンプレートフィルターと呼ばれ、変数の値にフィルターをかけるためのものです。この例では、フィルタによって Python の datetime オブジェクトを指定の形式にフォーマットしています (PHP の date 関数に似ていますね) 。</p>\n<p>フィルターはいくつでも好きなだけ繋げることが出来ます。また、独自の Python コードを実行する <a class=\"reference internal\" href=\"/ja/1.11/howto/custom-template-tags/#howto-writing-custom-template-filters\"><span class=\"std std-ref\">カスタムテンプレートフィルタ</span></a> や <a class=\"reference internal\" href=\"/ja/1.11/howto/custom-template-tags/\"><span class=\"doc\">カスタムテンプレートタグ</span></a> を書くことも出来ます。</p>\n<p>最後に、 Django にはテンプレートの継承という概念があります。 継承を宣言しているのは <code class=\"docutils literal notranslate\">{% extends &quot;base.html&quot; %}</code> の部分です。このタグは「まず ‘base’ というテンプレートをロードせよ。このテンプレートにはいくつかのブロックが定義されているが、それらのブロックの中身を以下のブロック定義で埋めよ」という命令です。要するに、テンプレートを継承すると、各テンプレートごとに固有の定義だけを記述すればよくなり、テンプレート間の冗長性が劇的に減るのです。</p>\n<p>ここでよくある“base.html” テンプレートで、 <a class=\"reference internal\" href=\"/ja/1.11/howto/static-files/\"><span class=\"doc\">静的ファイルの配信</span></a> を含む例をあげます:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code>mysite/templates/base.html</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"mysite/templates/base.html\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">static</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">img</span> <span class=\"na\">src</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">static</span> <span class=\"s2\">&quot;images/sitelogo.png&quot;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"na\">alt</span><span class=\"o\">=</span><span class=\"s\">&quot;Logo&quot;</span> <span class=\"p\">/&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>このテンプレートはサイトのルック &amp; フィール (とサイトのロゴ) を定義するだけ にまで、極度に単純化されています。また、子テンプレートで埋めるための「穴」 を提供しています。これによって、ベーステンプレート一つを変更するだけでサイ ト全体のデザインを簡単に変更できます。</p>\n<p>また、子テンプレートを変えずにベーステンプレートだけを変えた複数バージョン のサイトも作成できます。 Django の作者たちはこのテクニックを使い、新しいテンプレートを作成するだけでモバイル向けのまったく見栄えの違うサイトを作成してきました。</p>\n<p>他のシステムを使いたければ、必ずしも Django のテンプレートシステムを使う必 要はないということに注意してください。 Django のテンプレートシステムは Django のモデルレイヤと部分的にしっかり組み合わさっていますが、絶対に使わねばならないということではありません。さらに言えば、 Django のデータベース API を使う必然性もありません。別のデータベース抽象化レイヤを使っても構いま せんし、 XML ファイルやディスク上のファイルを読み込んでも構いません。何でもやりたいことをできるのです。Django の構成要素 – モデル、ビュー、テンプレー ト – は、互いに切り離して利用できるのです。</p>\n</section>\n<section id=\"this-is-just-the-surface\">\n<h2>これらはほんの一部にすぎません<a class=\"heading-anchor\" href=\"#this-is-just-the-surface\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>以上、 Django の機能についてざっと紹介してきました。 Django は他にもまだま だ便利な機能を備えています:</p>\n<ul class=\"simple\">\n<li><p>memcached などのバックエンドを組み込んだ  <a class=\"reference internal\" href=\"/ja/1.11/topics/cache/\"><span class=\"doc\">キャッシュフレームワーク</span></a> 。</p></li>\n<li><p>小さな Python クラスを書くだけで簡単に RSS や Atom フィードを生成できる <a class=\"reference internal\" href=\"/ja/1.11/ref/contrib/syndication/\"><span class=\"doc\">配信フィードフレームワーク</span></a> 。</p></li>\n<li><p>自動生成される admin のセクシーな機能の数々。ここで紹介したのはほんの表層の一部でしかありません。</p></li>\n</ul>\n<p>次は、あなたが <a class=\"reference external\" href=\"https://www.djangoproject.com/community/\">Django をダウンロード</a> して、 <a class=\"reference internal\" href=\"/ja/1.11/intro/tutorial01/\"><span class=\"doc\">チュートリアル</span></a> を読み、 <a class=\"reference external\" href=\"https://www.djangoproject.com/download/\">コミュニティ</a> に参加する番です。ご精読ありがとうございました!</p>\n</section>","rootId":"django-at-a-glance","toc":[{"title":"モデルの設計","anchor":"design-your-model","children":[]},{"title":"モデルのインストール","anchor":"install-it","children":[]},{"title":"自動生成される API で楽しむ","anchor":"enjoy-the-free-api","children":[]},{"title":"作業場 (scaffold) ではなく完成品 (whole house) の、動的な admin インタフェース","anchor":"a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house","children":[]},{"title":"URL を設計する","anchor":"design-your-urls","children":[]},{"title":"ビューの自作","anchor":"write-your-views","children":[]},{"title":"テンプレートを設計する","anchor":"design-your-templates","children":[]},{"title":"これらはほんの一部にすぎません","anchor":"this-is-just-the-surface","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"さぁ始めましょう。","url":"/ja/1.11/intro/"}],"prev":{"docname":"intro/index","title":"さぁ始めましょう。","url":"/ja/1.11/intro/"},"next":{"docname":"intro/install","title":"クイックインストールガイド","url":"/ja/1.11/intro/install/"},"formats":{"html":"/ja/1.11/intro/overview/","markdown":"/ja/1.11/intro/overview.md","json":"/ja/1.11/intro/overview.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/intro/overview.txt","official":"https://docs.djangoproject.com/ja/1.11/intro/overview/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","ko","es","el","pl"]}