[Day 34] 시간대와 날짜 및 시간 개체를 다루는

11235 단어 파이썬장고
February 16, 2021
←전회:Day 33 이미지 업로드 기능 부여

「Django를 배우고 싶다」라고 하는 것이라면 [Day 1] 장고 개발 환경 로부터 읽는 것을 추천합니다.

소개



이제 Djnago의 특징과 사용법이 오이타 보이지요. 이번에는 데이터베이스에 저장된 날짜와 시간을 이용하여 현재 시간과의 차이를 계산합니다.

날짜 및 시간 개체의 native 및 aware 정보



settings.py에서 USE_TZ = True로 설정하면 시간대가 지원됩니다. 이 상태에서 Django는 시간대를 인식하는 날짜 및 시간 객체 (aware 일시 객체)를 사용합니다. 본 사이트와 같이 startproject 명령에 의해 프로젝트를 생성한 경우는 초기 설정으로서 USE_TZ=True의 설정으로 되어 있습니다. 따라서 현재는 aware인 일시 객체를 사용해 왔습니다. 시간대가 사용 가능한 경우 데이터베이스는 UTC에서 날짜와 시간을 저장합니다. Django는 템플릿이나 폼 등으로 표시할 때, 설정된 타임 존에서 변환을 하고 있습니다.

데이터베이스



쉽게 데이터베이스에 대해 언급하고 싶습니다. 본 필자로서는 타임 존은 항상 유효하게 해 사용하는 것이 좋다고 생각하고 있습니다만, 타임 존의 유효·무효를 바꾸는 경우도 있다고 생각합니다. PostgreSQL은 시간대 정보를 데이터베이스에 저장하기 때문에 시간대의 활성화와 비활성화는 자유롭게 전환됩니다. 그러나 다른 데이터베이스의 경우 표준 시간대가 비활성화되어 있으면 UTC에서 네이티브 datetime으로 변환해야합니다.

현재 시간과의 차이를 계산하고 NEW 라벨을 붙입니다.



자, 이번에는 연습으로 한 시간 이내에 새로 만들어진 주제는 톱 페이지에 NEW 라벨을 표시하도록합시다. 톱 페이지를 표시하고 있는 뷰는 base/views.py의 TopicListView 클래스이므로, 여기에 손을 더해 갑니다.

base/views.py

from django.utils import timezone

class TopicListView(ListView):
    template_name = 'base/top.html'
    # model = Topic
    queryset = Topic.objects.order_by('-created')
    context_object_name = 'topic_list'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.new_list = []

    def get_queryset(self):
        topic_list = Topic.objects.order_by('-created')
        self.new_list = self._make_new_list(topic_list)
        return topic_list

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx['new_list'] = self.new_list
        return ctx

    def _make_new_list(self, topic_list):
        def pickup_topic(topic):
            now = timezone.now()
            diff = (now - topic.created).total_seconds() / (60 * 60)
            if diff > 1:
                return False
            else:
                return True
        return list(map(lambda x : x.id ,filter(pickup_topic, topic_list)))

해설은 불필요할까 생각합니다만, 현재 시각을 timezone.now()로 취득해 데이타베이스에 격납되고 있는 topic.created와 차이를 요구해 초를 시간으로 변환하고 있습니다. 이 시간이 1시간 이하의 토픽의 ID만의 리스트를 작성해 돌려주고 있는군요. 컨텍스트에 new_list를 전달하기 위해 new_list를 인스턴스 변수로 전달합니다.

라벨을 표시하도록 템플릿도 변경합시다.

templates/base/top.html (일부 발췌)

{% extends 'base/base.html' %}
{% block title %}ITについて切磋琢磨する掲示板 - {{ block.super }}{% endblock %}
{% block content %}
<div class="ui grid stackable">
    <div class="eleven wide column">
        <div class="ui breadcrumb">
            <a class="active section">TOP</a>
        </div>
        <div class="ui segment">
            <div class="content">
                <div class="header"><h3>新着スレッド</h3></div>
                <div class="ui divided items">
                    {% for topic in topic_list %}
                    <div class="item">
                        <div class="content">
                            <div class="header">
                                <a href="{% url 'thread:topic' pk=topic.id %}">
                                    <h4>
                                        {% if topic.id in new_list %}
                                        <div class="ui violet horizontal label">new</div>
                                        {% endif %}
                                        {{topic.title}}
                                    </h4>
                                </a>
                            </div>
                            <div class="meta">
                                <span class="name">{{topic.user_name}}</span>
                                <span class="date">{{topic.created}}</span>
                            </div>
                        </div>
                    </div>
                    {% endfor %}
                </div>
            </div>
        </div>
    </div>
    {% include 'base/sidebar.html' %}
</div>
{% endblock %}

모두 게재했습니다만, 수정점은 토픽 타이틀의 부분만입니다.

그럼 확인해 봅시다. 새로 주제를 만들면 NEW 라벨이 붙는군요.



결론



오랜만입니다. 부활했습니다. Django 학습장을 사용할 수 없게 되고 나서, 컨디션이 나빠져 버렸습니다. 그리고 이력서를 썼습니다.
오늘부터 다시 열심히 하고 싶습니다.

그럼 또 다시

←전회:Day 33 이미지 업로드 기능 부여
→다음 번:Day 35 스스로 web개발을 처음부터 만들어 보기로 했다

좋은 웹페이지 즐겨찾기