kb84tkhrのブログ

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

Djangoチュートリアル(5) ビュー

はじめての Django アプリ作成、その 3 | Django ドキュメント | Django

この前はPollsアプリを作ったと言っても
"Hello, World. You're at the polls index."と表示しただけ
ここでもう少し本格的になりそう

Django では、各ページとコンテンツはビューによって提供されます。各ビューは単純に Python 関数 (クラスベースビューの場合はメソッド) として実装されています。

ビューが関数として実装される、といっても
さすがにadminサイトみたいに定義しただけでページができるってことはないよな
こないだも同じこと思ってた気がする
どういう意味だっけ

インターネットサーフィンをしてるときなどに、 「ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B」 のような美しいURLを見かけることがあるでしょう。

あるある

Django はこんなものよりもっとエレガントな 「URLパターン」 を提供していると知っておいてください。
URLパターンは、URLを単に一般化したものです。例えば /newsarchive/<year>/<month>/ などです。
URLからビューにたどり着くために、 Django は 『URLconfs』 として知られているものを使います。

それって

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
]

とか

urlpatterns = [
    url(r'^$', views.index, name='index')
]

とかやったやつだな

polls/views.pyに関数を追加
文字列の書き方は今どき風にfstringで

def detail(request, question_id):
    return HttpResponse(f"You're looking at question {question_id}.")

def results(request, question_id):
    return HttpResponse(f"You're looking at the results of question {question_id}.")

def vote(request, question_id):
    return HttpResponse(f"You're voting on question {question_id}.")

そうかviewは関数、ってそういうことか確かにそのとおり

さてquestion_idにはどうやって値が入るのか

polls/urls.pyに追加

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

なるほど(?P)で指定するわけね

各ビューには二つの役割があります: 一つはリクエストされたページのコンテンツを含む HttpResponse オブジェクトを返すこと、もう一つは Http404 のような例外の送出です。それ以外の処理はユーザ次第です。

ビューはデータベースからレコードを読みだしても、読み出さなくてもかまいません。 Django のテンプレートシステム、あるいはサードパーティPython テンプ レートシステムを使ってもよいですし、使わなくてもかまいません。 PDF ファイルを生成しても、 XML を出力しても、 ZIP ファイルをその場で生成してもかまいません。 Python ライブラリを使ってやりたいことを何でも実現できます。

HTML/CSS使うときはここでテンプレートが登場するわけだな
はあくした