Je pense que c'est un cas courant que vous souhaitiez ** ajouter le badge Nouveau! À un nouvel article ** sur la page de liste d'articles d'un site comme un blog. Une façon de faire cela dans Django est d'ajouter un nouveau ou un nouveau bool au Context, mais je ne pense pas que ce soit une bonne idée de le faire dans un ListView. Cette fois, je vais vous montrer comment créer votre propre filtre de modèle et juger s'il s'agit d'un nouvel article dans le modèle.
Créez un répertoire templatetags /
dans <dossier de projet> / <dossier d'application> /
.
Cette application doit être écrite en INSTALLED_APP dans settings.py
.
Créez un fichier avec <n'importe quel nom> .py
dans le répertoire créé.
{% load <nom arbitraire>%}
dans le modèle, alors faites attention à la dénomination.
Cette fois, nous allons créer un filtre qui prend une valeur de type datetime et détermine si c'est la semaine dernière. Étant donné que ce filtre est utilisé pour brancher l'instruction if, la valeur de retour doit être booléenne.
python:.../templatetags/sample_filter.py
"""
Balise de modèle pour déterminer si la date correspond à la semaine dernière
"""
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):
#Date de base pour nouveau ou non
criteria_date = timezone.now() - datetime.timedelta(weeks=1)
return dt >= criteria_date
Du doc officiel
If you write a custom filter that operates on datetime objects, you'll usually register it with the expects_localtime flag set to True:
Lorsque vous créez un filtre personnalisé qui fonctionne avec un objet datetime, vous l'enregistrez généralement avec l'indicateur expects_localtime défini sur True.
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.
Si cet indicateur est défini et que le premier argument du filtre est une date et une heure tenant compte du fuseau horaire, Django suivra les règles de conversion du fuseau horaire du modèle et le fuseau horaire actuel avant de le transmettre au filtre à l'heure appropriée. Convertir en.
En d'autres termes, c'est un argument requis lors de l'exécution de calculs en tenant compte du fuseau horaire. La date / heure passée à la fonction de filtre sera la valeur en tenant compte du fuseau horaire.
Si vous le faites comme @ register.filter (name = 'foo')
, vous pouvez utiliser le filtre avec le nom foo dans le modèle.
Si vous ne passez pas l'argument de nom, le nom de la fonction sera le nom du filtre.
Puisque nous n'avons pas passé l'argument de nom cette fois, nous utiliserons le filtre avec le nom ʻis_new`.
template Utilisez-le dans le modèle comme suit. Voici un exemple d'affichage d'une liste de notifications et de mise en place d'un nouveau badge! Dans un délai d'une semaine. J'utilise bootstrap. C'est beaucoup plus propre que de passer un booléen qui détermine s'il est nouveau dans le contexte.
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 année m mois j jour H:i" }}</span>
<span class="badge badge-primary">{{ news.category }}</span>
{{ news.subject }}
<!--Juger s'il faut attacher un nouveau badge-->
{% if news.publish_time|is_new %}
<span class="badge badge-info badge-new">new!</span>
{% endif %}
</a>
{% empty %}
<p>Il n'y a pas de notification.</p>
{% endfor %}
...
Comme le filtre de date utilisé dans le code ci-dessus, le filtre peut également prendre des arguments. Ceci est une citation officielle de Doc,
def cut(value, arg):
"""Removes all values of arg from the given string"""
return value.replace(arg, '')
{{ somevariable|cut:"0" }}
Peut être utilisé comme. Lorsque get_context_data etc. devient gonflé, cela peut être une façon d'utiliser un filtre de modèle.
Balises et filtres de modèles uniques|Documentation Django| Django https://docs.djangoproject.com/ja/2.2/howto/custom-template-tags/
Recommended Posts