更改Django管理列表中的行颜色
我想根据模型中名为status的字段突出显示Django管理页面(change_list.html)中的行(设置backgorund颜色)。最好的方法是什么 我有三种状态。打开、激活、关闭。我希望开放的行为绿色,活动的行为橙色,关闭的行为红色更改Django管理列表中的行颜色,django,django-admin,django-templates,Django,Django Admin,Django Templates,我想根据模型中名为status的字段突出显示Django管理页面(change_list.html)中的行(设置backgorund颜色)。最好的方法是什么 我有三种状态。打开、激活、关闭。我希望开放的行为绿色,活动的行为橙色,关闭的行为红色 我发现是这样,但不确定如何检查状态以给行上色。事实证明,定制change\u list\u results.html和相关的生成器是一项艰巨的任务。我想提出一个完全不同的解决方案:为您的应用程序覆盖change_list.html,并使用Javascrip
我发现是这样,但不确定如何检查状态以给行上色。事实证明,定制change\u list\u 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 %}
{%extends“admin/change\u list.html”%}
{%block extrahead%}
{{block.super}}
(函数($){
$(文档).ready(函数(){
$('result_list tr td:nth child(7)')。每个(函数(){
如果($(this).text()!='active'){
$(this.css('background-color','orange');
}
});
});
})(django.jQuery);
{%endblock%}
这个文件是${TEMPLATE\u DIR}/admin/films/film/change\u list.html
。Django的结果列表是id'dresult\u list
,如果第7列的内容不符合我的喜好,我在这里所做的就是用不同的背景样式装饰该列
管理员已经提供了jQuery,因此不需要对您的应用程序或管理员进行任何其他更改即可实现此功能。我错了,还有另一种选择,就是使用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)
class-FilmAdmin(admin.ModelAdmin):
def胶片_状态(自身、obj):
如果对象状态()!='活动':
返回“%s”%obj.status()
返回对象状态()
胶片\状态。允许\标签=真
列表显示=(‘id’、‘标题’、‘电影状态’)
管理站点注册(电影,电影管理)
在这里,我创建了一个字段名,film\u status
,它在电影模型中不存在,并将其定义为FilmAdmin
的方法。它为每一行传递该项。我不得不告诉渲染器允许标记
,这会告诉管理员应用程序不要“保护”HTML内容
但这不会填满整个单元格,因为单元格本身有一些填充。只会填充应用程序允许填充的单元格部分(由管理员的样式表定义)。但这对我来说已经足够好了
好了。用于装饰Django管理员列表中单元格内容的两种完全不同但非常有用的技术。请查看,这正是您想要的。类FilmAdmin(admin.ModelAdmin):
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", )
def获取胶片状态(自身、obj):
如果对象状态()!='活动':
返回标记为安全(“%s”%obj.status())
班级媒体:
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";
}
}
window.onload=function(){
var x=document.getElementsByClassName(“row_gray”);
var i;
对于(i=0;i
噢,如果你想改变整行(圣诞节!),你可以把目标对准父对象的所有子对象:$('td',$(this).parent('tr'))而不是$(this)。我更喜欢这个解决方案。它看起来不太好,但是覆盖更改列表\u结果时没有任何问题。我在重写时遇到了问题,因为原始id\u字段
不再适用于我。下一个答案将很有帮助:format_html()
效果很好,我发现这是最干净的解决方案。不幸的是,jQuery在JS代码中不可访问。