Django отображает определенный текст, если дата старше 10 дней - PullRequest
0 голосов
/ 23 января 2019

Я работаю над проектом для клиента, который хочет отобразить «Оповещение» в таблице, если дата присоединения пользователей старше десяти дней. Я не хочу использовать фильтр только для возврата объектов, которые удовлетворяют запросу, потому что я хочу отобразить все элементы в таблице. Я использую 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 %}

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Вы можете получить все объекты, а затем добавить поле к каждому объекту, независимо от того, является ли он 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 %}
0 голосов
/ 23 января 2019

Вы можете просто добавить метод к вашей модели, например:

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ń

0 голосов
/ 23 января 2019

Есть как минимум два способа достичь этого

Метод поиска по методу

edit: Кредиты для этого идут на olinox14 , я не видел его ответ при редактировании моего.

Сначала убедитесь, что вы понимаете, что написано в официальной документации о Доступ к вызовам методов из шаблонов.

Что вы найдете наиболее интересным для вашего дела есть:

(...) И, конечно, вы можете легко получить доступ к методам, которые вы явно определили в своих собственных моделях

Имея это в виду, я призываю вас проверить ответ olinox14 .

Подход к пользовательскому шаблону

Вы можете использовать оператор 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 %}
(...)

Пожалуйста, обратитесь к этот ответ для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...