在Django应用中创建警报

-2 投票
2 回答
916 浏览
提问于 2025-04-17 16:05

我有一个模型,其中包含一个到期日期。这个字段看起来是这样的:

passport_date_of_expiry = TodayOrLaterDateField ('到期日期',)

这个字段会在管理员的列表显示中出现。我想要实现的是,当到期日期距离现在还有6个月或更短的时间时,列表中的这个项目会用红线高亮显示。或者,当发生这种情况时,系统能发送一封邮件作为提醒。我该如何轻松地实现这个功能呢?数据库中已经有很多数据了,这是我想要添加到系统中的一个新功能。

2 个回答

1

如果你想在管理界面的列表中高亮显示某个项目,你需要修改 admin/change_list_results.html 这个模板。这个文件中的一部分内容看起来是这样的:

{% for result in results %}
{% if result.form.non_field_errors %}
<tr><td colspan="{{ result|length }}">{{ result.form.non_field_errors }}</td></tr>
{% endif %}
<tr class="{% cycle 'row1' 'row2' %}">
    {% for item in result %}{{ item }}{% endfor %}   
</tr>
{% endfor %}

你可以尝试添加一些代码,检查结果项是否具有你想要的属性,然后使用不同于 row1 或 row2 的类名。记住,这个文件是用于管理界面中所有对象的。

至于发送邮件,你可以写一个独立的脚本,让它通过 cron 定时运行。确保把你的虚拟环境的路径添加到 sys.path 中,并把 os.environ["DJANGO_SETTINGS_MODULE"] 设置为你的项目设置。之后,你就可以轻松查询到过期的对象,并使用 django.core.mail.MailMessage 发送邮件。https://docs.djangoproject.com/en/1.4/topics/email/

3

要在管理界面中突出显示某些内容,你可以使用类似下面的代码(这个是从这个链接上找到的):

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    expiry_date = models.DateTimeField()

    def colored_name(self):
        if datetime.datetime.now() >= self.expiry_date:
            return '<span style="color: red;">%s %s</span>' % (self.first_name, self.last_name)
    colored_name.allow_tags = True

class PersonAdmin(admin.ModelAdmin):
    list_display = ('colored_name', 'first_name', 'last_name')

这段代码只会在管理界面的一个列上进行突出显示,但这样做是可以被注意到的。

如果你想要提醒自己,你应该创建一个管理命令,并通过定时任务(cron)来运行它。

项目/app/management/commands/check_expired.py:

# -*- coding: utf-8 -*-

from django.core import management
from django.core.mail import mail_admins


class Command(BaseCommand):

    def inner_run(self, *args, **options):
        expired_items = Model.objects.filter(expiry_date__lte=datetime.datetime.now())
        message = some_message_formatter(expired_items)

        mail_admins(subject='Alerts on my Project!', message=message)

定时任务(cron):

8 3 */15 * * cd /path/to/project && echo 'Activate virtual env if needed' && PYTHONPATH='Additional_python_path' DJANGO_SETTINGS_MODULE=your_project.settings django-admin.py check_expired

撰写回答