ユーザ用ツール

サイト用ツール


メモ:django2

Django2

Djangoメモの続き

組み込み管理画面の利用

プロジェクトの管理者(スーパーユーザ)を作成する。

$ python manage.py createsuperuser

ユーザ名、メールアドレス、パスワードを設定する。メールアドレスは空でも構わない。

管理画面にはhttp://[IP Address]:8000/admin/でアクセスできる。

管理画面では、各アプリケーションのモデルを管理することができる。モデルを管理するためには、管理画面にモデルを認識させる必要がある。

app01/report/admin.py

from django.contrib import admin
from .models import Choice, ReportContents

admin.site.register(Choice)
admin.site.register(ReportContents)

admin.pyにmodels.pyのクラスをインポートし、そのクラスをadminサイトに登録するとモデル(データベース)が管理画面の管理対象になる。管理画面からはデータベースにデータを登録、修正、削除などを行うことができる。

Viewの拡張

ここまででとりあえず基本機能を確認した。ここからは具体的な機能を作成していく。

URLからパラメータを受け取る

URLからパラメータを受け取ってViewに渡して利用する

report/urls.py

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:ReportContents_id>/', views.detail, name='detail'),
]

URLのパターンとして「<int:abc>」などとして山括弧で囲むと、その部分が補足できる。前半のintは、マッチするパターンを制限する。intは整数のみに限定して補足する。これを「パスコンバータ」「コンバータ」というようだ。正規表現でも記述できるが、よく使うパターンはintやstrなどで呼び出せる。後半のabcは補足したURLパターンの名前で、変数名のようなもの。Viewで利用するときに、この名前で呼び出せる。

report/views.py

def detail(request, ReportContents_id):
    return HttpResponse("You're looking at Report %s." % ReportContents_id)

View側ではディスパッチされた関数の引数に与えれば、関数内でURLの内容を利用できる。

ViewからModelを利用する

ViewからModelのデータを利用するには、Viewにモデルをインポートして、インポートしたオブジェクトのメソッドを使う。

report/views.py

from .models import ReportContents

var_a = ReportContents.objects.order_by('xxx')[:5]

テンプレートの利用

ここまでは、Viewでレスポンスの内容をすべて生成して、それをそのまま返していた。複雑なページを生成しようとすると、View内で非常に複雑なHTMLを作成しなければならない。そこでテンプレートシステムを利用する。

テンプレートを保存するディレクトリを作成する。テンプレートは、標準ではsettings.pyのINSTALLED_APPSに列挙されたアプリケーションのベースディレクトリ内にある「templates」ディレクトリから検索されるた、templateディレクトリを作成する。さらに、その中にアプリケーション名に対応したサブディレクトリが必要になるので、ここでは「template/report」ディレクトリも作成する。

report/views.py

def index(request):
    r_list = ReportContents.objects.order_by('hs_code')[:5]
    template = loader.get_template('report/index.html')
    context = {
        'r_list': r_list
    }
    return HttpResponse(template.render(context, request))

View側はテンプレートを指定して、データが格納されたオブジェクトと共に出力に送る。

テンプレートはtemplatesディレクトリからの相対パスを指定する。テンプレート内で利用するデータは、contextとして渡す。

report/template/index.html

{% if r_list %}
    <ul>
    {% for r in r_list %}
        <li><a href="/polls/{{ r.id }}/">{{ r.report_field01 }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

テンプレート側ではcontextとして渡されたオブジェクトの中に格納されているデータを適切にテンプレートに埋め込んで表示する。

Viewの一般的な利用

ここまででViewの実践的な使い方の基本を理解したが、Viewからテンプレートで使う変数をcontextとして渡してページを生成する手順は非常によく使うパターンである。そのため、Djangoではショートカットという形で簡略化した呼び出し方法が用意されている。

report/views.py

#from django.http import HttpResponse
#from django.template import loader
from .models import ReportContents

def index(request):
    r_list = ReportContents.objects.order_by('hs_code')[:5]
    context = {'r_list': r_list}
    return render(request, 'report/index.html', context)

render関数が必要なHttpResponseオブジェクトを生成してくれる。render関数にrequestオブジェクト、テンプレート、コンテキストとして辞書を渡せば、必要なHttpResponseを生成する。

render関数でショートカットする場合、HttpResponseやloaderをインポートしなくてもよい。

404エラー

データを検索したりして、指定されたデータがなかったり問題がある場合には、HTTPエラーを返したい場合がある。

reort/views.py

from django.http import Http404

def detail(request, ReportContents_id):
    try:
        Rep = ReportContents.objects.get(pk=ReportContents_id)
    except ReportContents.DoesNotExist:
        raise Http404("Data does not exist")
    return render(request, 'report/detail.html', {'Rep':Rep})

ここではURL経由で受け取ったIDに基づいてモデルを検索し、例外が発生した場合に404エラーを返している。

tryで検索結果が存在しないことを検出してHttp404オブジェクトを引数として例外を送出すれば、404エラーを返すことができる。

データを検索して存在しな場合に404エラーを送出するのはよくある処理なので、ショートカットがある。

report/views.py

from django.shortcuts import get_object_or_404

def detail(request, ReportContents_id):
    Rep = get_object_or_404(ReportContents, pk=ReportContents_id)
    return render(request, 'report/detail.html', {'Rep':Rep})

ショートカット関数をインポートして利用する。get_object_or_404関数は、第一引数にモデルを与え、その後に抽出の条件を任意の数与えると、対象が見つかれば対象をそのまま返し、見つからなければその場で例外として404オブジェクトを送出する。モデルのobject.getメソッドを使うショートカットの他に、listメソッドを呼び出すget_list_or_404などもある。

メモ/django2.txt · 最終更新: 2019/05/31 18:01 by Wiki Editor

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki