在Django应用中创建警报
我有一个模型,其中包含一个到期日期。这个字段看起来是这样的:
passport_date_of_expiry = TodayOrLaterDateField ('到期日期',)
这个字段会在管理员的列表显示中出现。我想要实现的是,当到期日期距离现在还有6个月或更短的时间时,列表中的这个项目会用红线高亮显示。或者,当发生这种情况时,系统能发送一封邮件作为提醒。我该如何轻松地实现这个功能呢?数据库中已经有很多数据了,这是我想要添加到系统中的一个新功能。
2 个回答
如果你想在管理界面的列表中高亮显示某个项目,你需要修改 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/
要在管理界面中突出显示某些内容,你可以使用类似下面的代码(这个是从这个链接上找到的):
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