Djangoに触る(その6)
6日目です.
チュートリアルの続きに挑みます
前回まで
404エラーの追加,またDjangoでよく使う操作をまとめてくれたモジュール類についての修正を行いました.
今日やったところ
はじめての Django アプリ作成、その 3 | Django ドキュメント | Django
ここの残り部分,テンプレートシステムの活用についてです. 短い….
テンプレートシステム
前前回辺りにテンプレートをロードし表示するところをやりました. その部分の追記です.
polls/detail.html
を以下のように修正します.
テンプレートシステムでは,次のように辞書検索でquestion
の該当物を探したり,for
を使う事でquestion
内のメソッドを呼び出しています.
<h1>{{ question.question_text }}</h1> <ul> {% for choice in question.choice_set.all %} <li>{{ choice.choice_text }}</li> {% endfor %} </ul>
テンプレート内のハードコーディングを消す
以前にビューのハードコーディングを残すと,のちのち修正が大変になるという話がありました. 具体的にはURLを変更したりするときなどに,変更困難になるなどのことが起きます.
そして現在もpolls/index.html
内にはハードコーディングが残ってしまっています.
{% if latest_question_list %} <ul> {% for question in latest_question_list %} <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li> {% endfor %} </ul> {% else %} <p>No polls are available.</p> {% endif %}
この
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
の部分を修正していきたいと思います.
過去にpolls/urls.py
の中で,url関数に関する記述を行いました.
url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
この記述を利用して,polls/index.html
を以下のように修正します
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
かつて url()
関数内でname
を定義認めそれを利用することで,/polls
という記述を消すことに成功しました.
逆に言えば,今後URLに関する変更を行いたいときは,polls/urls.py
を変更すればいいということです.
例えば,polls/12
と表示されていたところを,
polls/specifics/12
というURLに変えたいときは,以下のようにpolls/urls.py
を変更すればいいのです.
... url(r'^specifics/(?P<question_id>[0-9]+)/$', views.detail, name='detail'), ...
URLの名前空間の管理
先ほどまででURLの追記変更について説明しました.
今回はpolls
というアプリケーションしか存在しませんが,実際はこれより多くの数のアプリケーションとビューを管理することになります.
そんなとき,どのようにアプリとそのURLを区別するかについてかいていきます.
結論から言うと,URLconf
に対して名前空間を追加すればいいようです.
polls/urls.py
のなかのアプリケーションの名前空間の箇所を修正します.
今回はapp_name = 'palls'
を追加しました.
from django.conf.urls import url from . import views app_name = 'polls' urlpatterns = [ # ex: /polls/ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), ]
続いて,polls/index.html
テンプレートも修正します.
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li> {% endfor %}
を
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
に変更し,polls
のdetail
だよと言うことを教えてあげます.
おわりに
チュートリアル3が終わりました.
微妙に忙しくてペースが落ちてますが, もう少し頑張ります.