我想根据名为status的模型中的字段突出显示Django Admin页面(change_list.html)中的行(设置backgorund颜色)。这样做的最佳方式是什么?
我有3种状态。开放,主动,封闭。我想要打开的行为绿色,活动为橙色并且关闭为红色。
我发现了documentation about changing the templates,但不知道如何检查状态以为行着色。
答案 0 :(得分:18)
我错了,还有另一个使用Django管理员应用程序。
在应用的admin.py中,您可以为表格单元格的内容定义渲染器。这是我的电影库的变种:
class FilmAdmin(admin.ModelAdmin):
def film_status(self, obj):
if obj.status() != 'active':
return '<div style="width:100%%; height:100%%; background-color:orange;">%s</div>' % obj.status()
return obj.status()
film_status.allow_tags = True
list_display = ('id', 'title', 'film_status')
admin.site.register(Film, FilmAdmin)
在这里,我创建了一个字段名称film_status
,它在Film模型中不存在,并将其定义为FilmAdmin
的方法。它会传递每一行的项目。我必须告诉渲染器allow_tags
,它告诉管理员应用程序不要“安全”HTML内容。
这不会填满整个单元格,因为单元格本身有一些填充。只有您的应用程序允许填充的单元格部分(由管理员的样式表定义)才会被填充。但这对我的目的来说已经足够了。
你去吧。两种完全不同但有用的技术,用于在Django管理列表中修饰单元格的内容。
答案 1 :(得分:7)
事实证明,定制change_list_results.html和相关的生成器非常容易。我想提出一个完全不同的解决方案:为您的应用程序覆盖change_list.html,并使用Javascript来实现您想要的效果。
我遇到了完全相同的问题。对于一个电影库,我需要知道电影制片人的注册是“活跃的”还是别的。这是我的覆盖的全部内容:
{% extends "admin/change_list.html" %}
{% block extrahead %}
{{ block.super }}
<script type="text/javascript">
(function($) {
$(document).ready(function() {
$('#result_list tr td:nth-child(7)').each(function() {
if ($(this).text() != 'active') {
$(this).css('background-color', 'orange');
}
});
});
})(django.jQuery);
</script>
{% endblock %}
此文件为${TEMPLATE_DIR}/admin/films/film/change_list.html
。 Django的结果列表是id result_list
,如果列的内容不符合我的喜好,我在这里所做的就是用不同的背景样式装饰第7列。
管理员已经提供了jQuery,因此无需对您的应用程序或管理员进行其他更改即可实现此功能。
答案 2 :(得分:7)
查看django-liststyle,确切了解您的目标。
答案 3 :(得分:0)
class FilmAdmin(admin.ModelAdmin):
def get_film_status(self, obj):
if obj.status() != 'active':
return mark_safe("<span class='row_gray'>%s</span>" % obj.status())
class Media:
js = ("js/my_admin.js", )
和在my_admin.js中:
window.onload = function() {
var x=document.getElementsByClassName("row_gray");
var i;
for (i = 0; i < x.length; i++) {
var ligne=x[i].parentNode;
while (ligne.tagName !== "TR") {ligne=ligne.parentNode;}
ligne.style.backgroundColor = "lightgray";
}
}