{"title":"はじめての Django アプリ作成、その 6","version":"6.0","locale":"ja","docname":"intro/tutorial06","url":"/ja/6.0/intro/tutorial06/","canonical":"https://djangodocs.dev/ja/6.0/intro/tutorial06/","summary":"このチュートリアルは チュートリアル 5 の続きです。Web 投票アプリケーションのテストが完成したので、今度はスタイルシートや画像を追加しましょう。…","html":"<h1>はじめての Django アプリ作成、その 6<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-6\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>このチュートリアルは <a class=\"reference internal\" href=\"/ja/6.0/intro/tutorial05/\"><span class=\"doc\">チュートリアル 5</span></a> の続きです。Web 投票アプリケーションのテストが完成したので、今度はスタイルシートや画像を追加しましょう。</p>\n<p>サーバで生成するHTML以外に、Webアプリケーションは一般的に完全なWebページをレンダリングするために、画像、JavaScript、CSSなど必要なファイルを提供する必要があります。Djangoでは、これらのファイルを &quot;静的 (static) ファイル&quot; と呼びます。</p>\n<p>小さなプロジェクトではこのことは大きな問題になりません。 ウェブサーバが見つけられる場所で静的ファイルを単に管理することができるからです。しかし、もっと大きなプロジェクトで、特に複数のアプリケーションからなる場合は、各アプリケーションが 持っている静的ファイルの集まりを複数扱うことになり、ややこしくなってきます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.staticfiles</span></code> はまさにそのためにあります。これは静的なファイルを各アプリケーションから (さらに指定した別の場所からも) 一つの場所に集め、運用環境で公開しやすくするものです。</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">困ったときは:</p>\n<p>このチュートリアルの実行に問題がある場合は、FAQ の <a class=\"reference internal\" href=\"/ja/6.0/faq/help/\"><span class=\"doc\">Getting Help</span></a> セクションに進んでください。</p>\n</aside>\n<section id=\"customize-your-app-s-look-and-feel\">\n<h2><em>アプリ</em> のルック &amp; フィールをカスタマイズする<a class=\"heading-anchor\" href=\"#customize-your-app-s-look-and-feel\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>最初に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> ディレクトリの中に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">static</span></code> ディレクトリを作成します。Django はそこから静的ファイルを探します。Django が <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates/</span></code> からテンプレートを探す方法と同様です。</p>\n<p>Django の <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-STATICFILES_FINDERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATICFILES_FINDERS</span></code></a> は、さまざまなソースから静的ファイルを検索する方法を知っているファインダのリストです。デフォルトのファインダの一つは <code class=\"docutils literal notranslate\"><span class=\"pre\">AppDirectoriesFinder</span></code> で、<a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> に書かれた各アプリケーションに対して、ちょうど今作った <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> の &quot;static&quot; サブディレクトリのようなフォルダを検索してくれます。管理サイトの静的ファイルにも、これと同じディレクトリ構造が使われます。</p>\n<p>先ほど作成した <code class=\"docutils literal notranslate\"><span class=\"pre\">static</span></code> ディレクトリ内に <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> という名前のディレクトリを作り、その中に <code class=\"docutils literal notranslate\"><span class=\"pre\">style.css</span></code> というファイルを作成します。言い換えれば、スタイルシートは <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/style.css</span></code> にあるはずです。 <code class=\"docutils literal notranslate\"><span class=\"pre\">AppDirectoriesFinder</span></code> のスタティックファイルファインダがどのように動作するかによって、Djangoではこのスタティックファイルを <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/style.css</span></code> として参照することができます。</p>\n<aside class=\"admonition-static-file-namespacing admonition\">\n<p class=\"admonition-title\">静的ファイルの名前空間</p>\n<p>テンプレートと同様に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> という別のサブディレクトリを作らずに、直接 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static</span></code> の中に静的ファイルを置いてもいいのではないか、と思うかもしれませんね。しかし、それは実際には悪い考えです。Django は、名前がマッチした最初のテンプレートを使用するので、もし <em>異なる</em> アプリケーションの中に同じ名前のテンプレートがあった場合、Django はそれらを区別できません。そのため、Django に正しいテンプレートを教えてあげる必要がありますが、一番簡単な方法は、それらに <em>名前空間を与える</em> ことです。アプリケーションと同じ名前をつけた <em>もう一つの</em> ディレクトリの中にテンプレートを置いたのは、そういうわけなのです。</p>\n</aside>\n<p>スタイルシートに次のコードを配置します (<code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/style.css</span></code>):</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"css\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/style.css</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Css</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=\"Css code\"><code><span class=\"nt\">li</span><span class=\"w\"> </span><span class=\"nt\">a</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"k\">color</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"kc\">green</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p>次に、<code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates/polls/index.html</span></code> の上部に追加します:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates/polls/index.html</span></code></figcaption>\n<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=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">static</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">link</span> <span class=\"na\">rel</span><span class=\"o\">=</span><span class=\"s\">&quot;stylesheet&quot;</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">static</span> <span class=\"s1\">&#39;polls/style.css&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">static</span> <span class=\"pre\">%}</span></code> テンプレートタグは、静的ファイルの完全 URL を生成します。</p>\n<p>あなたが開発する必要があるのは、これですべてです。</p>\n<p>次のコマンドを実行して、サーバーを起動します (すでに起動済みの場合は再起動します)。</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><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<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver\n</code></pre></div></div></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">http://localhost:8000/polls/</span></code> をリロードすると、質問のリンクが緑色 (Django のスタイルです！) になり、スタイルシートが適切に読み込まれたことが確認できるでしょう。</p>\n</section>\n<section id=\"adding-a-background-image\">\n<h2>背景画像を追加する<a class=\"heading-anchor\" href=\"#adding-a-background-image\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>次に画像用にサブディレクトリを作成します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/</span></code> ディレクトリの中に <code class=\"docutils literal notranslate\"><span class=\"pre\">images</span></code> サブディレクトリを 作ります。ディレクトリの中に背景と使用したい画像ファイルを追加します。このチュートリアルでは  <code class=\"docutils literal notranslate\"><span class=\"pre\">background.png</span></code> という名前ファイルを使用します。このファイルのフルパスは  <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/images/background.png</span></code> となるようにします。</p>\n<p>さらに、スタイルシート (<code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/style.css</span></code>) に画像への参照を追加します。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"css\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/style.css</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Css</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=\"Css code\"><code><span class=\"nt\">body</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"k\">background</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"kc\">white</span><span class=\"w\"> </span><span class=\"nb\">url</span><span class=\"p\">(</span><span class=\"s2\">&quot;images/background.png&quot;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"kc\">no-repeat</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">http://localhost:8000/polls/</span></code> をリロードすると、読み込んだ背景画像がスクリーンの左上部に確認できるでしょう。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">static</span> <span class=\"pre\">%}</span></code> テンプレートタグは、スタイルシートのように Django によって生成されない静的ファイルで使用することはできません。静的ファイル間で相互にリンクする際には、常に <strong>相対パス</strong> を使用すべきです。なぜなら、 <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-STATIC_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATIC_URL</span></code></a> (<a class=\"reference internal\" href=\"/ja/6.0/ref/templates/builtins/#std-templatetag-static\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">static</span></code></a> テンプレートタグがURLを生成するために使用する) を変更した場合でも、静的ファイル内の多くのパスを修正する必要がなくなるからです。</p>\n</aside>\n<p>これらは静的ファイルの <strong>基本</strong> です。設定方法やフレームワークの機能の詳細については、<a class=\"reference internal\" href=\"/ja/6.0/howto/static-files/\"><span class=\"doc\">静的ファイルの配信</span></a> と <a class=\"reference internal\" href=\"/ja/6.0/ref/contrib/staticfiles/\"><span class=\"doc\">staticfiles のリファレンス</span></a> を読んでください。<a class=\"reference internal\" href=\"/ja/6.0/howto/static-files/deployment/\"><span class=\"doc\">静的ファイルのデプロイ</span></a> では、実際のサーバでの静的ファイルの使い方について説明しています。</p>\n<p>静的ファイルを使いこなせるようになったら、<a class=\"reference internal\" href=\"/ja/6.0/intro/tutorial07/\"><span class=\"doc\">チュートリアル その7</span></a> に進んで、Django が自動生成する管理サイトのカスタマイズをしてみましょう。</p>\n</section>","rootId":"writing-your-first-django-app-part-6","toc":[{"title":"アプリ のルック & フィールをカスタマイズする","anchor":"customize-your-app-s-look-and-feel","children":[]},{"title":"背景画像を追加する","anchor":"adding-a-background-image","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"さぁ始めましょう","url":"/ja/6.0/intro/"}],"prev":{"docname":"intro/tutorial05","title":"はじめての Django アプリ作成、その 5","url":"/ja/6.0/intro/tutorial05/"},"next":{"docname":"intro/tutorial07","title":"はじめての Django アプリ作成、その 7","url":"/ja/6.0/intro/tutorial07/"},"formats":{"html":"/ja/6.0/intro/tutorial06/","markdown":"/ja/6.0/intro/tutorial06.md","json":"/ja/6.0/intro/tutorial06.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/intro/tutorial06.txt","official":"https://docs.djangoproject.com/ja/6.0/intro/tutorial06/","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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}