組み込みタグとは、Djangoのテンプレートを利用する際に値を変換する便利な機能。こちらの記事で、タグを作成する方法について記載した。
今回の記事では、時刻を表示する組み込みタグのdate, time, nowについて詳細に説明する。
組み込みタグdateの使い方
dateは、dateフォーマットの変数をテンプレート上で指定した形式に変換して表示するためのタグ。以下のような書き方をする。
{{ value|date:"D d M Y" }}
dateフォーマットとは、以下のようなクラスの変数を含む。
- django.db.models.DateTimeField
- datetime.datetime(pythonの標準ライブラリ)
- datetime.date(pythonの標準ライブラリ)
では実装してみましょう。
- models.pyの実装
from django.utils import timezone
from django.urls import reverse
class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
Postモデルのcreated_date、published_dateはmodels.DateTimeFieldとして設定している。
次にviews.pyで、ListViewを使ってモデルから値を取得してみる。
- views.pyの実装
class PostListView(ListView):
model = Post
def get_queryset(self):
return Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
次にtemplateで以下のように日付を変換する。
- テンプレート(post_list.html)の実装
{% block content %}
<div class="centerstage">
{% for post in post_list %}
<div class="post">
<h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
<div class="date">
<p>Published on: {{ post.published_date|date:"Y m d"}}</p>
<!-- |date "Y m d"(年 月 日) -->
</div>
<a href="{% url 'post_detail' pk=post.pk %}">Comments: {{ post.approve_comments.count }}</a>
</div>
{% endfor %}
</div>
{% endblock %}
このように設定すると画面では、下のように表示される。
ちなみに、|dateの横の"Y m d"は他にも定義の方法がある。
詳細は、こちらの公式サイトをご参照下さい
他にも、以下のようにpythonの標準ライブラリのdatetime.dateにdateフィルターを使うこともできる。
- views.pyの実装
from datetime import date
from . import models
class SchoolListView(ListView):
model = models.School
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["new_date"] = date.today()# 日付をpythonの標準ライブラリから取得
return context
テンプレートは、以下のように定義する。
- テンプレートの実装の実装
{% block body_block %}
<h1>Welcome to a list of all schools</h1>
<ol>
{% for school in school_list %}
<h2><li><a href="{{ school.id }}">{{ school.name }}</a></li></h2>
<h4>{{ new_date|date:"Y m d" }}</h4>
{% endfor %}
</ol>
{% endblock %}
画面上は、以下のように表示される。
組み込みタグ(time)の使い方
timeの場合は、以下のようなクラスの変数を利用できる。
- django.db.models.DateTimeField
- datetime.datetime(pythonの標準ライブラリ)
views.pyは下のように定義する。
- views.pyの実装
from . import models
from django.views.generic import ListView
class SchoolListView(ListView):
model = models.School
template_name = 'basic_app/school_list.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["new_date"] = datetime.now()
return context
次に、テンプレートは以下のように定義する。
- テンプレートの実装の実装
{% block body_block %}
<h1>Welcome to a list of all schools</h1>
<ol>
{% for school in school_list %}
<h2><li><a href="{{ school.id }}">{{ school.name }}</a></li></h2>
<h4>{{ new_date|date:"Y/m/d H:i:s" }}</h4>
{% endfor %}
</ol>
{% endblock %}
実行すると、以下のように表示される。
組み込みタグ(now)の使い方
nowを利用すると、テンプレート上に現在時刻を表示できるようになる。
以下のように記載する。
{% now "Y/m/d H:i:s" %}
例えば、テンプレートを以下のように実装する。
- テンプレートの実装の実装
{% block body_block %}
<h1>Welcome to a list of all schools</h1>
<ol>
{% for school in school_list %}
<h2><li><a href="{{ school.id }}">{{ school.name }}</a></li></h2>
{% endfor %}
</ol>
<h4>{% now "Y/m/d H:i:s" %}</h4>
{% endblock %}
立ち上げると、画面上で以下のように表示される。
以上で、テンプレートの組み込みタグ、date, time, nowの利用方法について記載しました。
テンプレート上で、dateのフォーマットを変えたい場合は是非、ご活用下さい