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.
Erstellen Sie ein templatetags /
Verzeichnis in <Projektordner> / <Anwendungsordner> /
.
Diese Anwendung muss in INSTALLED_APP in settings.py
geschrieben sein.
Erstellen Sie eine Datei mit "
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
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.
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 %}
...
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.
Einzigartige Vorlagen-Tags und Filter|Django-Dokumentation| Django https://docs.djangoproject.com/ja/2.2/howto/custom-template-tags/