Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

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に渡せる。