kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Djangoチュートリアル(8) テンプレート

えーとどこまでいったかな
404返すところまでだった
今日はテンプレートをもう少し本格的に

{{question}}とだけ書いてたpolls/templates/polls/detail.htmlを修正

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{%endfor%}
</ul>

わかる
わかるんだけど

テンプレートシステムは、変数の属性にアクセスするためにドット検索の構文を使用します。 {{ question.question_text }} を例にすると、はじめに Django は question オブジェクトに辞書検索を行います。それに失敗したら、今度は属性として検索を行い、このケースの場合は成功します。もし属性の検索に失敗すると、リストインデックスでの検索を行います。

辞書検索・属性として検索・リストインデックスの検索っていうのはなんだろう

questionが辞書だと思ってquestion["question_text"]を探し、ダメなら
questionがオブジェクトだと思ってquestion.question_textを探し(ここで見つかる)、
それもダメならquestionがリストだと思ってえーとなんだ?
question["question_text"]じゃないな
どうやらquestion.1と書いてquestion[1]を探す、ということらしい

ところで
htmlとかheadとかbodyとかつけなくていいんだろうか
もしかして勝手につけてくれるのかな

と思ったけどついてないや
ただ省略してるだけだな


polls/templates/index.htmlの

<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

とも書ける
これはurls.pyの

    url(r"^(?P<question_id>[0-9]+)/$", views.detail, name="detail"),

に対応してる
urlで引数みたいに与えられてるquestion.id?Pに入るってことだろうな

こうすることで、URLの形式を変えたいというときに全テンプレートで置換するとかしないで、
urls.pyの1箇所を修正すればいいようになる
DRYDRY

ひとつのDjangoプロジェクトで複数のアプリを動かすときは、
urls.pyでapp_nameを指定すると区別できる

app_name = 'polls'
urlpatterns = ...

テンプレートではこう指定

<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>