Подтвердить что ты не робот

Изменить цвет строки в списке администраторов Django

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

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

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

4b9b3361

Ответ 1

Отметьте django-liststyle, именно то, что вам нужно.

Ответ 2

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

Это не будет заполнять всю ячейку, хотя сама ячейка имеет некоторое дополнение. Будет заполнена только часть ячейки, которую ваше приложение может заполнить (как определено в таблице стилей администратора). Но это достаточно хорошо для моих целей.

Там вы идете. Две совершенно разные, но полезные методы для оформления содержимого ячейки в списке admin в Django.

Ответ 3

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

Ответ 4

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";
    }
}