2017年8月14日月曜日

Django で TemplateViewを利用する

Django のクラスベース汎用ビューは、よく記述するビューのパターンを簡易に利用できるようにしたものである。
その中の TemplateView は与えられたテンプレートをレンダリングする際に使用する。

TemplateView を利用する場合、レンダリングするためのデータ取得は get_context_data をオーバライドし、辞書型のコンテキストを返せばよい。
    def get_context_data(self, **kargs):
        # データ取得するための処理...
        return {取得したデータは辞書型で返す}
以下の例では、取得したデータを django-tables2 を利用して表示している。
[view.py]

class ActorTemplate(TemplateView):
    template_name = "sample.html"

    def get_context_data(self, **kargs):
        actors = Actor.objects.order_by("first_name", "last_name")
        actortable = ActorTable(actors)
        RequestConfig(self.request,
                      paginate={"per_page": 20}).configure(actortable)
        return {"title": "HOGE TITLE",
                "actortable": actortable}
[models.py]

class Actor(models.Model):
    actor_id = models.SmallIntegerField(primary_key=True)
    first_name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=45)
    last_update = models.DateTimeField()
[tables.py]

class ActorTable(tables.Table):
    first_name = tables.Column(accessor="first_name",
                               verbose_name="First Name",
                               orderable=False,
                               attrs={"th": {"id": "first_name_id"}}
                               )
    last_name = tables.Column(accessor="last_name",
                              verbose_name="Last Name",
                              orderable=False,
                              attrs={"th": {"id": "last_name_id"}}
                              )
[urls.py]

urlpatterns = [
    url(r'^actors/',
        ActorTemplate.as_view()),
]
[sample.html]
{% load render_table from django_tables2 %}
{% load static %}

<html>
<head>
  <title>{{ title }}</title>
  <link rel="stylesheet" href="{% static 'django_tables2/themes/paleblue/css/screen.css' %}" />
  <style type="text/css">
    th#first_name_id {width: 150px}    
    th#last_name_id {width: 150px}    
  </style>
</head>

<body>
{% render_table actortable %}
</body>

</html>

0 件のコメント:

コメントを投稿