如何在Django模板中有条件地为表格单元格着色?

时间:2013-10-11 01:25:51

标签: django django-templates

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

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

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

p.s:我用这个问题作为设计的灵感来源。 django table cell color based on expression

2 个答案:

答案 0 :(得分:2)

我会将此任务转移到模板标记,以尽可能保持模板的清洁。简而言之,您将创建一个模板标记,它接受您的上下文变量,决定颜色并返回一个字符串。

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

答案 1 :(得分:1)

首先创建自定义管理更改列表模板,您可以在其中加载自定义模板标记:

{% 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