1

我通过上下文变量从模型中传递背景单元格和数据的默认颜色。但是当我解析模型数据时,在模板内部,我想有条件地为各个单元格着色。

<tr><td style="background-color:{{tarcol}};">{{poll.target}}</td></tr>
<tr><td style="background-color:{{actcol}};">{{poll.actual}}</td></tr>

颜色取决于目标和实际的相对值,所以我必须比较数据来决定颜色。我在想我不应该添加逻辑来决定视图中的颜色,这必须在模板中完成。有没有更好的方法来处理这个??

ps:我用这个问题作为设计的灵感。 基于表达式的django表格单元格颜色

4

2 回答 2

2

我会将此任务委托给模板标签,以使模板尽可能干净。简而言之,您将创建一个模板标签,它接受您的上下文变量、决定颜色并返回一个字符串。

有关帮助和示例,请参阅:https ://docs.djangoproject.com/en/1.5/howto/custom-template-tags/。

于 2013-10-11T01:35:28.537 回答
1

首先创建自定义管理员 change_list 模板,您可以在其中加载自定义模板标签:

{% load i18n grp_tags admin_urls admin_static admin_list my_admin_list %}

复制现有的 admin_list.py 并更改:

        def items_for_result(cl, result, form):
            if f is None:
            ...                
            css_class = getattr(attr, 'css_class', False)
                if css_class:
                    row_class = mark_safe(' class="%s"' % css_class(result))

In admin.py have something like:

class Media:
        css = {
            'all': ('/static/custom_admin.css',)
        }
...

def job_driver_car(self, obj):
        return '{0} <strong>{1}</strong><br>{2}'.\
            format(obj.driver_type,
                   obj.driver_grade,
                   obj.car_type)
    job_driver_car.short_description = 'Driver / Car'
    job_driver_car.css_class = lambda obj: 'background lightyellow' \
        if obj.driver_grade is not None and 'NEW' in obj.driver_grade else ''
    job_driver_car.allow_tags = True

和 CSS 本身:

table tbody tr.grp-row-odd td.background, table tbody tr.grp-row-odd th.background,
table tbody tr.grp-row-even td.background, table tbody tr.grp-row-even th.background,
table tbody tr.grp-alt td.background, table tbody tr.grp-alt th.background {
    background: transparent;
}
.lightyellow { background: #ffd090 !important; }

我开发这个解决方案是因为我需要根据实例值对几乎每个单元格进行着色。检查 Django==1.6.2 和 django-grappelli==2.5.2

于 2015-08-03T08:19:21.390 回答