eCommerce2 part11 ListView
List Viewを作成する
- このあたりを参照にしながら作成していく。
Generic display views | Django documentation | Django
- products/views.py
ListViewをimport, class でListViewを継承、modelに,models.py からのmodelclassを代入
+ from django.views.generic.list import ListView + class ProductListView(ListView): + model = Product
- products/urls.py にlistviewのurlを挿入 仮置きとして、以下の通り置いてみる。
+ url(r'^$', ProductListView.as_view(), name='product_list'),
この時点では、templatedoesnotexist ちなみに、templateの設定がない場合は、products/product_list.html を自動で参照。
- products/product_list.html
{% extends "base.html" %} {% block content %} {{ object_list }} {% endblock %}
- class based viewの、listviewでは、何がcontextとして渡されているのかを確認するためには、ちょっとした関数を書くと調べられる。
class ProductListView(ListView): model = Product def get_context_data(self, *args, **kwargs): context = super(ProductListView, self).get_context_data(*args, **kwargs) print (context) return context
context には、ProductListView内にある、get_context_dataが代入される。 それをprint 表示する。以下のように結構たくさんある。
{'is_paginated': False, 'object_list': [<Product: テスト>], 'product_list': [<Product: テスト>], 'paginator': None, 'view': <products.views.ProductListView object at 0x109584748>, 'page_obj': None}
object_listと、product_listは同じぽいね。
- そのため、新しく、productlistviewにcontextを渡すには以下のようにしてみる。
from django.utils import timezone def get_context_data(self, *args, **kwargs): context = super(ProductListView, self).get_context_data(*args, **kwargs) context["now"] = timezone.now print (context) return context
context["<key名>"] = value で、context辞書に追加できる。
- for 構文を使って、listを作成できる
templates/products/product_list.html
{% extends "base.html" %} {% block content %} <table class='table'> {% for object in object_list %} <tr> <td>{{ object.id }}</td> <td>{{ object.title }}</td> </tr> {% endfor %} </table> {% endblock %}
ListViewで現時点でわかっていること。
- contextで?、自動的にobject_list が渡される。object_listは、instanceのlistになっている。
- contextに追加するには、以下のようにget_context_data関数を呼び出す必要あり?
def get_context_data(self, *args, **kwargs): context = super(ProductListView, self).get_context_data(*args, **kwargs) context["now"] = timezone.now print (context) return context
- userは、function view 同様にtemplateに渡せる。