PUROGU LADESU

ポエムがメインのブログです。

【Django】チュートリアル3〜4 ビューの作成、フォーム

その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を返すことで、戻るボタンを押されたときの二重登録しないようにできる。

クラス型ビュー

典型的なビューはジェネリックビューを使うと簡単につくれる。
from django.views import generic

まとめ

templatesフォルダが最初から作られていないのが不親切。
templatesは各アプリのフォルダの中に入れるのが良さそう。サブフォルダを作らないといけないのが冗長に思えるが、後々パッケージ化する際に有利なのかもしれない。
クラス型ビューはちょっとブラックボックスすぎるかな。