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>