文書の過去の版を表示しています。
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として渡されたオブジェクトの中に格納されているデータを適切にテンプレートに埋め込んで表示する。