3
votes

Django affiche un texte spécifique si la date est antérieure à 10 jours

Je travaille sur un projet pour un client qui souhaite afficher «Alerte» dans un tableau si la date de connexion d'un utilisateur est antérieure à dix jours. Je ne souhaite pas utiliser de filtre pour renvoyer uniquement les objets qui satisfont à la requête car je souhaite afficher tous les membres de la table. J'utilise Django 2.x et python 3.6. Toute aide serait grandement appréciée.

models.py:

{% extends "base.html" %}
{% load static %}
{% block content %}
<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Join Date</th>
            <th>Alert</th>
        </tr>
    </thead>
    <tbody>
        {% for member in object_list %}
        <tr>
            <td>{{ member.name }}</td>
            <td>{{ member.join_date }}</td>
            <td> **??**</td>
        </tr>
        {% endfor %}
    </tbody>
</table>
{% endblock %}

views.py:

def memberList(request, template_name='members/memberList.html'):
    member = Member.objects.all()
    data = {}
    data['object_list'] = member
    return render(request, template_name, data)

et mon modèle, memberList.html:

class Member(models.Model):
    name = models.CharField('Name', max_length=50,)
    join_date = models.DateField('Join Date', auto_now=False, auto_now_add=False,)


1 commentaires

Hé, est-ce que ma réponse ou celle de olinox14 a fonctionné pour vous? Si oui, veuillez accepter l’une ou l’autre de ces recommandations.


4 Réponses :


3
votes

Il y a au moins deux façons d'y parvenir

Approche de recherche de méthode

edit: Les crédits pour celui-ci vont à olinox14 , je n'ai pas vu sa réponse en éditant la mienne.

Tout d'abord, assurez-vous de comprendre ce qui est écrit dans la documentation officielle sur l' accès aux appels de méthode à partir des modèles.

Ce que vous trouverez le plus intéressant pour votre cause, c'est:

(...) Et bien sûr, vous pouvez facilement accéder aux méthodes que vous avez explicitement définies sur vos propres modèles

Gardant cela à l'esprit, je vous encourage à vérifier la réponse d'olinox14 .

Approche de balise de modèle personnalisé

Vous pouvez utiliser l'instruction if des modèles Django et utiliser la balise de modèle personnalisée pour calculer le résultat réel. Cela devrait ressembler à quelque chose comme

(...)
        {% for member in object_list %}
        <tr>
            <td>{{ member.name }}</td>
            <td>{{ member.join_date }}</td>
            <td>{% if member.join_date|is_older_than_ten_days %}YOUR INFO
                {% else %}something else{% endif %}</td>
        </tr>
        {% endfor %}
(...)

Et puis dans votre modèle, utilisez-le comme ceci:

from django import template
import datetime 


register = template.Library() 


@register.filter(expects_localtime=True)
def is_older_than_ten_days(value):
    if isinstance(value, datetime.datetime):
        value = value.date()
    delta = value - datetime.date.today()
    return delta.days > 10

Veuillez vous référer à cette réponse pour plus de détails.


0 commentaires

0
votes

Vous pouvez obtenir tous les objets, puis ajouter un champ à chaque objet, qu'il ait ou non 10 jours.Vous pouvez affecter une variable booléenne, disons isOld et restituer dans le modèle par {% if isOld %} comme ceci:

{% extends "base.html" %}
{% load static %}
{% block content %}
<table>
    <thead>
    <tr>
        <th>Name</th>
        <th>Join Date</th>
        <th>Alert</th>
    </tr>
</thead>
<tbody>
    {% for member in object_list %}
    <tr>
        <td>{{ member.name }}</td>
        <td>{{ member.join_date }}</td>
        {% if member.isOld %}
        <td style="color:red;"> Old Alert</td>
        {% else %}
        <td style="color:green;"> New Alert</td>
        {% endif %}
    </tr>
    {% endfor %}
</tbody>
</table>
{% endblock %}

Dans votre modèle, vous pouvez:

import datetime
def memberList(request, template_name='members/memberList.html'):
    data={}
    members = Member.objects.all()
    for i in members:

        delta=datetime.datetime.today() - i.join_date
        if delta.days < 10:
           i.isOld=False
        else:
           i.isOld=True
    data["object_list"]=members
    return render(request, template_name, data)


0 commentaires

1
votes

Vous pouvez simplement ajouter une méthode à votre modèle, comme ça:

    <tr>
        <td>{{ member.name }}</td>
        <td>{{ member.join_date }}</td>
        <td>{{ member.older_than_ten_days }}</td>
    </tr>

Ensuite, votre modèle devient simplement:

class Member(models.Model):
    name = models.CharField('Name', max_length=50,)
    join_date = models.DateField('Join Date', auto_now=False, auto_now_add=False,)

    def older_than_ten_days(self):
        return (datetime.date.today() - self.join_date).days > 10

Cependant, si vous avez besoin de passer plus de paramètres à la méthode, comme un nombre variable de jours, vous devez utiliser la solution Aleksander ZieÅ „


0 commentaires

0
votes

Vous pouvez utiliser Models.object.filter pour filtrer dans views.py

Comme voir ce que j'ai fait dans mon projet, on utilise la date par défaut HTML pour la sélection de la date ie proj1 / templates / tasks.html

def tasks(request):
if request.method == "POST":
    date01 = request.POST['date']
    s1 = request.session['session_id']
    if Tasks01.objects.filter(day=date01).exists():
        print('yes')
        task = Tasks01.objects.filter(day=date01,registerdb4=s1)
        return render(request, "tasks.html", {'task': task})
    else:
        print("no records")
        return render(request, "tasks.html")
return render(request, "tasks.html")

puis dans proj1 / app1 / models.py

class Tasks01(models.Model):
registerdb4 = models.ForeignKey(Register, on_delete=models.CASCADE)
Ename = models.CharField(u'Name of employee', max_length=100)
supervisor_name = models.CharField(u'Supervisor Name', max_length=100, blank=True)
title = models.CharField(u'Title', max_length=200)
description = models.TextField(u'Description')
day = models.DateField(u'Date')
start_time = models.TimeField(u'Starting Time')
end_time = models.TimeField(u'Ending Time')

def __str__(self):
    return "%s %s" %(self.Ename, self.day)

puis dans proj1 / app1 / views.py

<form method="POST" action="/tasks/">
      {% csrf_token %}
      <input type="date" value="date" id="date" name="date">
      <button type="submit" class="btn-submit">Submit</button>
</form>


0 commentaires