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,)
4 Réponses :
Il y a au moins deux façons d'y parvenir
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 .
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.
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)
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Å „
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>
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.