Изменить цвет строки в списке администратора Django - PullRequest
12 голосов
/ 25 октября 2010

Я хочу выделить строки (установить цвет фона) на странице администрирования Django (change_list.html) на основе поля в модели с именем status. Каков наилучший способ сделать это?

У меня 3 статуса. Открыто, Активно, Закрыто. Мне бы хотелось, чтобы строки с открытым были зелеными, активные - оранжевыми, а красные - закрытыми.

Я нашел документацию об изменении шаблонов , но не уверен, как проверить состояние, чтобы закрасить строку.

Ответы [ 4 ]

18 голосов
/ 26 октября 2010

Я ошибся, есть другая альтернатива, использующая только приложение администратора 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.

7 голосов
/ 28 октября 2010

Проверьте django-liststyle , именно то, что вы ищете.

7 голосов
/ 25 октября 2010

Как выясняется, настройка файла 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'd result_list, все, что я здесь делаю, это украшаю столбец 7 другим стилем фона, если содержимое столбца мне не нравится.

Администратор уже предоставляет jQuery, поэтому никаких дополнительных изменений в вашем приложении или администраторе для этой работы не требуется.

0 голосов
/ 08 мая 2019
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";
    }
}
...