メモ:django2
差分
このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン | ||
メモ:django2 [2019/05/29 17:22] – 作成 Wiki Editor | メモ:django2 [2019/05/31 18:01] (現在) – [Viewの一般的な利用] Wiki Editor | ||
---|---|---|---|
行 21: | 行 21: | ||
admin.pyにmodels.pyのクラスをインポートし、そのクラスをadminサイトに登録するとモデル(データベース)が管理画面の管理対象になる。管理画面からはデータベースにデータを登録、修正、削除などを行うことができる。 | admin.pyにmodels.pyのクラスをインポートし、そのクラスをadminサイトに登録するとモデル(データベース)が管理画面の管理対象になる。管理画面からはデータベースにデータを登録、修正、削除などを行うことができる。 | ||
+ | |||
+ | ===== Viewの拡張 ===== | ||
+ | ここまででとりあえず基本機能を確認した。ここからは具体的な機能を作成していく。 | ||
+ | |||
+ | ==== URLからパラメータを受け取る ==== | ||
+ | URLからパラメータを受け取ってViewに渡して利用する | ||
+ | |||
+ | report/ | ||
+ | urlpatterns = [ | ||
+ | path('', | ||
+ | path('< | ||
+ | ] | ||
+ | |||
+ | URLのパターンとして「< | ||
+ | |||
+ | report/ | ||
+ | def detail(request, | ||
+ | return HttpResponse(" | ||
+ | |||
+ | View側ではディスパッチされた関数の引数に与えれば、関数内でURLの内容を利用できる。 | ||
+ | |||
+ | |||
+ | |||
+ | ==== ViewからModelを利用する ==== | ||
+ | ViewからModelのデータを利用するには、Viewにモデルをインポートして、インポートしたオブジェクトのメソッドを使う。 | ||
+ | |||
+ | report/ | ||
+ | from .models import ReportContents | ||
+ | | ||
+ | var_a = ReportContents.objects.order_by(' | ||
+ | |||
+ | |||
+ | ==== テンプレートの利用 ==== | ||
+ | ここまでは、Viewでレスポンスの内容をすべて生成して、それをそのまま返していた。複雑なページを生成しようとすると、View内で非常に複雑なHTMLを作成しなければならない。そこでテンプレートシステムを利用する。 | ||
+ | |||
+ | テンプレートを保存するディレクトリを作成する。テンプレートは、標準ではsettings.pyのINSTALLED_APPSに列挙されたアプリケーションのベースディレクトリ内にある「templates」ディレクトリから検索されるた、templateディレクトリを作成する。さらに、その中にアプリケーション名に対応したサブディレクトリが必要になるので、ここでは「template/ | ||
+ | |||
+ | report/ | ||
+ | def index(request): | ||
+ | r_list = ReportContents.objects.order_by(' | ||
+ | template = loader.get_template(' | ||
+ | context = { | ||
+ | ' | ||
+ | } | ||
+ | return HttpResponse(template.render(context, | ||
+ | |||
+ | View側はテンプレートを指定して、データが格納されたオブジェクトと共に出力に送る。 | ||
+ | |||
+ | テンプレートはtemplatesディレクトリからの相対パスを指定する。テンプレート内で利用するデータは、contextとして渡す。 | ||
+ | |||
+ | |||
+ | report/ | ||
+ | {% if r_list %} | ||
+ | <ul> | ||
+ | {% for r in r_list %} | ||
+ | < | ||
+ | {% endfor %} | ||
+ | </ul> | ||
+ | {% else %} | ||
+ | <p>No polls are available.</ | ||
+ | {% endif %} | ||
+ | |||
+ | テンプレート側ではcontextとして渡されたオブジェクトの中に格納されているデータを適切にテンプレートに埋め込んで表示する。 | ||
+ | |||
+ | |||
+ | ===== Viewの一般的な利用 ===== | ||
+ | ここまででViewの実践的な使い方の基本を理解したが、Viewからテンプレートで使う変数をcontextとして渡してページを生成する手順は非常によく使うパターンである。そのため、Djangoではショートカットという形で簡略化した呼び出し方法が用意されている。 | ||
+ | |||
+ | report/ | ||
+ | #from django.http import HttpResponse | ||
+ | #from django.template import loader | ||
+ | from .models import ReportContents | ||
+ | | ||
+ | def index(request): | ||
+ | r_list = ReportContents.objects.order_by(' | ||
+ | context = {' | ||
+ | return render(request, | ||
+ | |||
+ | render関数が必要なHttpResponseオブジェクトを生成してくれる。render関数にrequestオブジェクト、テンプレート、コンテキストとして辞書を渡せば、必要なHttpResponseを生成する。 | ||
+ | |||
+ | render関数でショートカットする場合、HttpResponseやloaderをインポートしなくてもよい。 | ||
+ | |||
+ | ===== 404エラー ===== | ||
+ | データを検索したりして、指定されたデータがなかったり問題がある場合には、HTTPエラーを返したい場合がある。 | ||
+ | |||
+ | reort/ | ||
+ | from django.http import Http404 | ||
+ | | ||
+ | def detail(request, | ||
+ | try: | ||
+ | Rep = ReportContents.objects.get(pk=ReportContents_id) | ||
+ | except ReportContents.DoesNotExist: | ||
+ | raise Http404(" | ||
+ | return render(request, | ||
+ | |||
+ | ここではURL経由で受け取ったIDに基づいてモデルを検索し、例外が発生した場合に404エラーを返している。 | ||
+ | |||
+ | tryで検索結果が存在しないことを検出してHttp404オブジェクトを引数として例外を送出すれば、404エラーを返すことができる。 | ||
+ | |||
+ | データを検索して存在しな場合に404エラーを送出するのはよくある処理なので、ショートカットがある。 | ||
+ | |||
+ | |||
+ | report/ | ||
+ | from django.shortcuts import get_object_or_404 | ||
+ | | ||
+ | def detail(request, | ||
+ | Rep = get_object_or_404(ReportContents, | ||
+ | return render(request, | ||
+ | |||
+ | ショートカット関数をインポートして利用する。get_object_or_404関数は、第一引数にモデルを与え、その後に抽出の条件を任意の数与えると、対象が見つかれば対象をそのまま返し、見つからなければその場で例外として404オブジェクトを送出する。モデルのobject.getメソッドを使うショートカットの他に、listメソッドを呼び出すget_list_or_404などもある。 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ |
メモ/django2.1559118134.txt.bz2 · 最終更新: 2019/05/29 17:22 by Wiki Editor