向 Django 管理员添加“状态灯”

Posted

技术标签:

【中文标题】向 Django 管理员添加“状态灯”【英文标题】:Adding a "status light" to Django admin 【发布时间】:2012-06-14 21:57:01 【问题描述】:

我正在运行一组信息亭,每个信息亭都显示来自我的 Django 应用程序的内容。每个信息亭每分钟 ping 一个类似 myurl.com/location=downtown 的 URL,以查看是否有任何更新。

我的 models.py 看起来像这样。每次 ping 模型时,都会更新 last_updated。

class Location(models.Model):
    name = models.CharField(max_length=20)
    last_update = models.DateTimeField()

不幸的是,自助服务终端中的浏览器每隔一段时间就会崩溃。我要做的是在管理界面的前面添加,在我登录后,一个绿色或红色的小灯表示自其中一个位置更新以来是否已经超过 5 分钟。

这是为应用程序制作心跳的最佳方式吗?如何修改管理界面以显示状态灯以查看信息亭是否正常?

【问题讨论】:

【参考方案1】:

糟糕,我在重新阅读问题之前输入了以下内容。因此,如果您想在列表中显示 Location 的自定义列,请执行以下操作。否则,请查看@jpic 的答案。

--

是的,您可以使用 ModelAdmin 上的方法定义 custom Admin 列,如下所示:

import datetime
from django.contrib import admin
from my_app.models import Location

class LocationAdmin(admin.ModelAdmin):
    list_display = ('name', 'slug', 'custom_column',)

    # define the row x column value here
    def custom_column(self, obj):
        if obj.last_updated < datetime.datetime.now() - datetime.timedelta(minutes=5):
            retval = ('red.jpg', 'This location checked in more than 5 minutes')
        else
            retval = ('green.jpg', 'This location checked in less than 5 minutes ago')
        return "<img src='%s' alt='%s' />" % retval

    # set the column heading here
    custom_column.short_description = 'Status'

# don't forget to register the newly sub-classed ModelAdmin
admin.site.register(Location, LocationAdmin)

自定义方法也可以是模型本身的属性。详情请见admin docs。

【讨论】:

用新版本的Django import html from django.utils 然后用return html.format_html("&lt;img src='%s' alt='%s' /&gt;" % retval) 显示HTML【参考方案2】:

    Make a custom template tag 显示信息亭更新时的指示灯

    Override the admin base template,即。将django/contrib/admin/templates/admin/base_site.html复制到your_project/templates/admin/base_site.html

    在您复制的管理基本模板中添加您的模板标签

这是一些工作,但希望您需要的一切都记录在案。

【讨论】:

【参考方案3】:

自从我在 Django 工作以来已经有一段时间了,所以我无法帮助您编写代码。但是您的问题似乎在 Django 中应该很容易。

管理界面有点神奇,我认为您不应该尝试破解它来添加状态灯。 (有可能自从我看了 Django 之后他们改变了一些东西,也许现在没那么神奇了?)

但是创建一个显示状态的新页面并让该页面仅对管理员可用应该很容易。您可以为 Firefox 或 Chrome 获取一个自动刷新页面的插件,这将导致 Django 重新运行查询并重新构建页面。然后,当您在管理界面中执行管理操作时,只需保持该页面打开并刷新即可。

【讨论】:

如果用户当前正在阅读表单中编辑模型的列表,页面自动刷新可能会很烦人...... 我建议仅在具有自己的 URL 的特定页面上自动刷新,该页面仅显示状态信息。只读页面,不是管理界面的一部分。

以上是关于向 Django 管理员添加“状态灯”的主要内容,如果未能解决你的问题,请参考以下文章

Django South 向管理员添加了模型,但给出了 DatabaseError

向 Django 2.1 管理站点添加忘记密码功能

如何向具有多对一关系的模型的 Django 管理员添加可排序的计数列?

django 管理界面 change_form.html 向 querydict/post 添加数据?

在管理界面上向 Django 内联对象添加自定义操作

向Django Admin添加键盘快捷键功能