[PYTHON] [Django 2.2] Fügen Sie neuen Posts mit einem Datum mithilfe eines Vorlagenfilters ein neues Abzeichen hinzu

Überblick

Ich denke, es ist ein häufiger Fall, dass Sie das New! Badge einem neuen Artikel auf der Artikellistenseite einer Website wie einem Blog hinzufügen möchten. Eine Möglichkeit, dies in Django zu tun, besteht darin, dem Kontext einen neuen oder neuen Bool hinzuzufügen, aber ich denke nicht, dass es eine gute Idee ist, dies in einer ListView zu tun. Dieses Mal werde ich Ihnen zeigen, wie Sie Ihren eigenen Vorlagenfilter erstellen und beurteilen, ob es sich um einen neuen Artikel in der Vorlage handelt.

Umgebung

Dateierstellung

Erstellen Sie ein templatetags / Verzeichnis in <Projektordner> / <Anwendungsordner> /. Diese Anwendung muss in INSTALLED_APP in settings.py geschrieben sein.

Erstellen Sie eine Datei mit " .py" im erstellten Verzeichnis. ist hier "{% load %}" in der Vorlage. Seien Sie also vorsichtig bei der Benennung.

Erstellen Sie einen Filter

Dieses Mal erstellen wir einen Filter, der einen Wert vom Typ datetime annimmt und feststellt, ob es die letzte Woche ist. Da dieser Filter zum Verzweigen der if-Anweisung verwendet wird, sollte der Rückgabewert bool sein.

python:.../templatetags/sample_filter.py


"""
Vorlagen-Tag, um festzustellen, ob das Datum die letzte Woche ist
"""
import datetime

from django import template
from django.utils import timezone

register = template.Library()


@register.filter(expects_localtime=True)
def is_new(dt: datetime.datetime):
    #Basisdatum für neu oder nicht
    criteria_date = timezone.now() - datetime.timedelta(weeks=1)
    return dt >= criteria_date

Über expected_localtime = True

Aus dem offiziellen Doc

If you write a custom filter that operates on datetime objects, you'll usually register it with the expects_localtime flag set to True:

Wenn Sie einen benutzerdefinierten Filter erstellen, der mit einem Datum / Uhrzeit-Objekt funktioniert, registrieren Sie ihn normalerweise mit dem Flag "expected_localtime", das auf "True" gesetzt ist.

When this flag is set, if the first argument to your filter is a time zone aware datetime, Django will convert it to the current time zone before passing it to your filter when appropriate, according to rules for time zones conversions in templates.

Wenn dieses Flag gesetzt ist und das erste Argument des Filters ein zeitzonenabhängiges Datum und eine Uhrzeit ist, befolgt Django die Zeitzonen-Konvertierungsregeln der Vorlage und die aktuelle Zeitzone, bevor es zum richtigen Zeitpunkt an den Filter übergeben wird. Konvertieren zu.

Mit anderen Worten, es ist ein Argument, das erforderlich ist, wenn Berechnungen unter Berücksichtigung der Zeitzone durchgeführt werden. Die an die Filterfunktion übergebene Datums- und Uhrzeitangabe ist der Wert unter Berücksichtigung der Zeitzone.

Benennung

Wenn Sie dies als "@ register.filter (name =" foo ") tun, können Sie den Filter mit dem Namen" foo "in der Vorlage verwenden. Wenn Sie das Argument name nicht übergeben, ist der Funktionsname der Name des Filters. Da wir das Argument name diesmal nicht übergeben haben, verwenden wir den Filter mit dem Namen "is_new".

template Verwenden Sie es in der Vorlage wie folgt. Das folgende Beispiel zeigt, wie Sie innerhalb einer Woche eine Liste mit Benachrichtigungen anzeigen und ein neues! Badge anhängen. Ich benutze Bootstrap. Es ist viel sauberer als ein Bool zu übergeben, das bestimmt, ob es neu im Kontext ist.

template


{% load sample_filter %}
    ...
    {% for news in news_list %}
    <a href="{% url 'news:detail' news.pk %}" class="list-group-item list-group-item-action">
    <span>{{ news.publish_time |date:"Y Jahr m Monat d Tag H.:i" }}</span>
    <span class="badge badge-primary">{{ news.category }}</span>
    {{ news.subject }}
    <!--Beurteilung, ob ein neues Abzeichen angebracht werden soll-->
    {% if news.publish_time|is_new %}
    <span class="badge badge-info badge-new">new!</span>
    {% endif %}
    </a>
    {% empty %}
    <p>Es erfolgt keine Benachrichtigung.</p>
    {% endfor %}
    ...

andere

Wie der im obigen Code verwendete Datumsfilter kann auch der Filter Argumente annehmen. Dies ist ein offizielles Doc-Zitat.

def cut(value, arg):
    """Removes all values of arg from the given string"""
    return value.replace(arg, '')
{{ somevariable|cut:"0" }}

Kann verwendet werden als. Wenn get_context_data usw. aufgebläht wird, kann dies eine Möglichkeit sein, einen Vorlagenfilter zu verwenden.

Referenz

Einzigartige Vorlagen-Tags und Filter|Django-Dokumentation| Django https://docs.djangoproject.com/ja/2.2/howto/custom-template-tags/

Recommended Posts

[Django 2.2] Fügen Sie neuen Posts mit einem Datum mithilfe eines Vorlagenfilters ein neues Abzeichen hinzu
Machen Sie einen Filter mit einer Django-Vorlage
So führen Sie eine arithmetische Verarbeitung mit der Django-Vorlage durch
So fügen Sie ein Paket mit PyCharm hinzu
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Versuchen Sie, mit django-import-export csv-Daten zu django hinzuzufügen
So entwickeln Sie eine Cart-App mit Django
Wenn Sie den Wert mithilfe von Auswahlmöglichkeiten in der Vorlage im Django-Modell anzeigen möchten
Versuchen Sie, mit WebSocket mit Django (Swamp Dragon) eine Todo-Verwaltungssite zu erstellen.
Erstellen Sie eine Shogi-Score-Management-Anwendung mit Django 5 ~ DB-Daten an Vorlage übergeben ~
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Wenn Sie mit dem Django REST-Framework filtern möchten
Übergang zum Update-Bildschirm mit dem Django-Tag
[Morphologische Analyse] So fügen Sie Mecab ein neues Wörterbuch hinzu
Model.objects.extra muss berücksichtigt werden, bevor Raw SQL mit Django verwendet wird
[Django] Muster zum Hinzufügen verwandter Datensätze nach dem Erstellen eines Datensatzes
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
So lösen Sie den CSRF-Schutz bei Verwendung von AngularJS mit Django
Hinzufügen neuer Daten (gerade Linien und Diagramme) mit matplotlib
So generieren Sie eine Abfrage mit dem IN-Operator in Django
Die übliche Art, einen Kernel mit Jupyter Notebook hinzuzufügen
Fügen Sie MeCab ein Wörterbuch hinzu
Erstellen Sie eine Homepage mit Django
Verwenden eines Druckers mit Debian 10
Erstellen Sie eine Shogi Score Management App mit Django 6 ~ Split Template ~
Rails-Benutzer versuchen, mit Django eine einfache Blog-Engine zu erstellen
Versuchen Sie, ein neues Bild mit dem trainierten StyleGAN2-Modell zu bearbeiten
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
Geben Sie die Ergebnisse der Nachsuche mithilfe der Mattermost-API in eine Datei aus
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
[Tipps] Die Vorgehensweise beim Erstellen von HTML mit Django wird erweitert
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen