しゃちの備忘録

プログラミングを中心とした技術関連の備忘録です(今のところ)

Djangoに触る(その6)

6日目です.

チュートリアルの続きに挑みます

前回まで

teru0rc4.hatenablog.com

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>

に変更し,pollsdetailだよと言うことを教えてあげます.

おわりに

チュートリアル3が終わりました.

微妙に忙しくてペースが落ちてますが, もう少し頑張ります.