在Django Admin List中更改行颜色

时间:2010-10-25 13:19:15

标签: django django-admin django-templates

我想根据名为status的模型中的字段突出显示Django Admin页面(change_list.html)中的行(设置backgorund颜色)。这样做的最佳方式是什么?

我有3种状态。开放,主动,封闭。我想要打开的行为绿色,活动为橙色并且关闭为红色。

我发现了documentation about changing the templates,但不知道如何检查状态以为行着色。

4 个答案:

答案 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";
    }
}