使HTML自定义字段在django-admin中可排序



我有一个非常简单的模型,它只包含一个名称和序列号。我可以使用该序列号来请求API上的状态,并且我想将结果显示为图标/HTML:

class ProductAdminForm(admin.ModelAdmin):
class Meta:
model = Product
fields = ["get_status", "name",]
def get_status(self, obj):
status = get_status_from_API(obj)["status"]
style = """style="height: 10px; width: 10px; border-radius: 50%; COLOR display: inline-block;" """

if status == 2:
new_style = style.replace("COLOR", "background-color: green;")
elif status == 1:
new_style = style.replace("COLOR", "background-color: red;")
else:
new_style = style.replace("COLOR", "background-color: grey;")
return mark_safe(f"""<span class="dot" {new_style}></span>""")

如何使get_status列可排序?

您只能对数据库中的属性进行排序。

通常,list_display中不是实际数据库字段的元素不能用于排序(因为Django在数据库级别执行所有排序(。

https://docs.djangoproject.com/en/3.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

这意味着您无法在API中对对象的状态进行排序。但是,您可以通过设置admin_order_field对其他一些属性(如序列号(进行排序。

如果您真的想对状态进行排序,您需要以某种方式将此状态存储在数据库中。

一种解决方案是定期调用一个管理命令,该命令获取所有对象的状态并将结果存储在数据库中。

这样就可以根据对象的状态对其进行排序(和筛选(。

将API结果存储在数据库中还有一个好处,即在管理员中查看对象时不需要进行任何API调用。当API运行缓慢时,这一点尤其有用。明显的缺点是,根据调用update命令的频率,结果可能会稍微过时。

最新更新