我正在为一个客户在项目中工作,如果用户的加入日期早于10天,则该客户希望在表中显示“警报”。我不想使用过滤器只返回满足查询条件的对象,因为我想显示表中的所有成员。我正在使用Django 2.x和python 3.6。任何帮助将不胜感激。
models.py:
class Member(models.Model):
name = models.CharField('Name', max_length=50,)
join_date = models.DateField('Join Date', auto_now=False, auto_now_add=False,)
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)
和我的模板memberList.html:
{% 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 %}
答案 0 :(得分:3)
至少有两种方法可以实现这一目标
编辑:,这一点功劳归于olinox14,在编辑我的消息时没有看到his answer。
首先,请确保您了解official documentation中有关在模板内访问方法调用的内容。
您会发现最有趣的原因是
(...)当然,您可以轻松访问在自己的模型上明确定义的方法
请记住,我鼓励您检查olinox14's answer。
您可以使用Django模板的if语句,并使用自定义模板标记来计算实际结果。看起来应该像
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
然后在模板中像这样使用它:
(...)
{% 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 %}
(...)
有关更多详细信息,请参阅this answer。
答案 1 :(得分:1)
您可以简单地向模型中添加一个方法,就像这样:
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
然后您的模板就变成:
<tr>
<td>{{ member.name }}</td>
<td>{{ member.join_date }}</td>
<td>{{ member.older_than_ten_days }}</td>
</tr>
但是,如果您需要将更多参数传递给该方法(例如可变天数),则必须使用Aleksander Zień solution
答案 2 :(得分:0)
您可以获取所有对象,然后向每个对象添加一个字段,无论该字段是否已存在10天。您可以分配一个布尔变量,如isOld,并用{% if isOld %}
呈现在模板中,如下所示:
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)
在您的模板中,您可以:
{% 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 %}
答案 3 :(得分:0)
您可以使用Models.object.filter在views.py中过滤掉
就像查看我在项目中所做的那样,使用HTML默认日期进行日期选择,即proj1 / templates / tasks.html
<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>
然后在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)
然后在proj1 / app1 / views.py
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")