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