如果日期早于10天,则Django显示特定文本

时间:2019-01-23 15:41:46

标签: django python-3.x django-views

我正在为一个客户在项目中工作,如果用户的加入日期早于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 %}

4 个答案:

答案 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")