その3ビューの作成
urls.pyにルートを書いていく
urlpatternsのパラメータはviews.pyの引数の名前と一致させること。
path('<int:question_id>', views.detail, name='detail'), def detail(request, question_id): return render(request, 'polls/detail.html', context)
テンプレートを用意する
アプリディレクトリの中にtemplatesディレクトリを作成、さらにその中にアプリ名のディレクトリを作成
polls/templates/polls/xxxxx.html
settings.pyのAPP_DIRSがTrueの場合、INSTALLED_APPS のそれぞれの "templates" を参照しに行く。
エラーの場合404を表示してくれる便利関数
get_object_or_404()
get_list_or_404()
URL名前空間
urls.pyのルート名に名前空間をつけられる。
nameに名前空間をあわせて指定できる。
app_name = 'polls' をurls.pyに追加するだけ。
テンプレートのurlタグやredirectで 'polls:xxxxx' でアクセス。
ループのカウンター
{{% for item in items %}}
{{ forloop.counter }}
{{% endfor %}}
その4 フォーム
POSTパラメータの受け取り
request.POST['choice']
例外KeyErrorはディクショナリのしていキーがなかった際に発生する。(getで取れば例外を回避可能)
リダイレクト
POSTを行った後にHttpResponseRedirectやredirectを返すことで、戻るボタンを押されたときの二重登録しないようにできる。
まとめ
templatesフォルダが最初から作られていないのが不親切。
templatesは各アプリのフォルダの中に入れるのが良さそう。サブフォルダを作らないといけないのが冗長に思えるが、後々パッケージ化する際に有利なのかもしれない。
クラス型ビューはちょっとブラックボックスすぎるかな。