[Django 2.2] Ajouter un nouveau badge aux nouveaux messages avec une date à l'aide d'un filtre de modèle

Aperçu

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.

environnement

Création de fichier

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éé. voici {% load <nom arbitraire>%} dans le modèle, alors faites attention à la dénomination.

Créer un filtre

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

À propos de ʻexpects_localtime = True`

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.

appellation

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 %}
    ...

autre

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.

référence

Balises et filtres de modèles uniques|Documentation Django| Django https://docs.djangoproject.com/ja/2.2/howto/custom-template-tags/

Recommended Posts

[Django 2.2] Ajouter un nouveau badge aux nouveaux messages avec une date à l'aide d'un filtre de modèle
Créer un filtre avec un modèle django
Comment effectuer un traitement arithmétique avec le modèle Django
Comment ajouter un package avec PyCharm
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
Essayez d'utiliser django-import-export pour ajouter des données csv à django
Comment développer une application de panier avec Django
Si vous souhaitez afficher la valeur à l'aide des choix du modèle dans le modèle Django
Essayez de créer un site de gestion Todo en utilisant WebSocket avec Django (Swamp Dragon)
Créer une application de gestion de partition shogi à l'aide de Django 5 ~ Passer les données de la base de données au modèle ~
(Python) Essayez de développer une application Web en utilisant Django
Lorsque vous souhaitez filtrer avec le framework Django REST
Transition vers l'écran de mise à jour avec le Django a tag
[Analyse morphologique] Comment ajouter un nouveau dictionnaire à Mecab
Model.objects.extra à prendre en compte avant d'utiliser du SQL brut avec Django
[Django] Pattern pour ajouter des enregistrements associés après avoir créé un enregistrement
J'ai créé un package pour filtrer les séries chronologiques avec python
Je veux créer un éditeur de blog avec l'administrateur de django
Comment résoudre la protection CSRF lors de l'utilisation d'AngularJS avec Django
Comment ajouter de nouvelles données (lignes droites et tracés) à l'aide de matplotlib
Comment générer une requête à l'aide de l'opérateur IN dans Django
La façon habituelle d'ajouter un noyau avec Jupyter Notebook
Ajouter un dictionnaire à MeCab
Créer une page d'accueil avec django
Utiliser une imprimante avec Debian 10
Créez une application de gestion de partition shogi à l'aide de Django 6 ~ Split Template ~
Les utilisateurs de Rails essaient de créer un moteur de blog simple avec Django
Essayez de modifier une nouvelle image à l'aide du modèle StyleGAN2 entraîné
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
Exporter les résultats de la recherche de publication dans un fichier à l'aide de l'API Mattermost
J'ai essayé de créer une application todo en utilisant une bouteille avec python
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
[Astuces] Comment étendre le modèle lors de la création de HTML avec django
Django super introduction par les débutants Python! Partie 3 J'ai essayé d'utiliser la fonction d'héritage de fichier de modèle
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle