我有一个非常简单的模型,它只包含一个名称和序列号。我可以使用该序列号来请求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命令的频率,结果可能会稍微过时。