Django - 修改结果列表项中的css

时间:2017-09-28 08:52:13

标签: django django-admin

我的管理面板中有简单的结果列表。例如,它是这样的:

id名称描述类别

在我的管理面板中有结果列表,其中包含类" row1"," row2"。我想根据obj值添加另一个类(obj.group_id未列出)。我的意思是:

if obj.group_id == 2:
    add class "premium" to result list item  # whole row with this item

我想简单区分django管理面板中的某些行。 我不知道如何实现这一目标。有线索吗?

我可以在一列上更改css。例如:

def show_url(self, obj):
    if obj.group.group_name == 'Premium':
        return format_html(
            '<span class="premium"><a style="color:blue" href="{}">{}</a></span>'.format(obj.url, obj.url)
        )
    return '<a style="color:blue" href="{}">{}</a>'.format(obj.url, obj.url)
show_url.allow_tags = True
show_url.short_description = "Url"

我想为整行设置不同的背景......

1 个答案:

答案 0 :(得分:0)

Django没有做出你认为轻松的任务......

首先,您需要创建一个新的template_tags:
我调用了文件 admin_override.py

# -*- coding: utf-8 -*-

from django.contrib.admin.templatetags.admin_list import (
    ResultList, items_for_result,
    result_headers, result_hidden_fields
)

from django.template import Library
register = Library()


def results(cl):
    if cl.formset:
        for res, form in zip(cl.result_list, cl.formset.forms):
            yield ResultList(form, items_for_result(cl, res, form))
    else:
        for res in cl.result_list:
            yield {
                'class': res.admin_css_class,
                'items': ResultList(None, items_for_result(cl, res, None))
            }


@register.inclusion_tag("admin/change_list_results_with_class.html")
def result_list_with_class(cl):
    """
    Displays the headers and data list together
    """
    headers = list(result_headers(cl))
    num_sorted_fields = 0
    for h in headers:
        if h['sortable'] and h['sorted']:
            num_sorted_fields += 1
    return {'cl': cl,
            'result_hidden_fields': list(result_hidden_fields(cl)),
            'result_headers': headers,
            'num_sorted_fields': num_sorted_fields,
            'results': list(results(cl))}

这个新的template_tag返回一个dict列表而不是ResultList列表,并将渲染模板更改为&#34; admin / change_list_results_with_class.html&#34;。

然后您需要覆盖 change_list.html ,例如answer

{% extends "admin/change_list.html" %}
{% load i18n admin_urls static admin_list admin_override%}

{% block result_list %}
    {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %}
    {% result_list_with_class cl %}
    {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %}
{% endblock %}

最后你创建 admin / change_list_results_with_class.html

{% load i18n static %}
{% if result_hidden_fields %}
<div class="hiddenfields">{# DIV for HTML validation #}
{% for item in result_hidden_fields %}{{ item }}{% endfor %}
</div>
{% endif %}
{% if results %}
<div class="results">
<table id="result_list">
<thead>
<tr>
{% for header in result_headers %}
<th scope="col" {{ header.class_attrib }}>
   {% if header.sortable %}
     {% if header.sort_priority > 0 %}
       <div class="sortoptions">
         <a class="sortremove" href="{{ header.url_remove }}" title="{% trans "Remove from sorting" %}"></a>
         {% if num_sorted_fields > 1 %}<span class="sortpriority" title="{% blocktrans with priority_number=header.sort_priority %}Sorting priority: {{ priority_number }}{% endblocktrans %}">{{ header.sort_priority }}</span>{% endif %}
         <a href="{{ header.url_toggle }}" class="toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% trans "Toggle sorting" %}"></a>
       </div>
     {% endif %}
   {% endif %}
   <div class="text">{% if header.sortable %}<a href="{{ header.url_primary }}">{{ header.text|capfirst }}</a>{% else %}<span>{{ header.text|capfirst }}</span>{% endif %}</div>
   <div class="clear"></div>
</th>{% endfor %}
</tr>
</thead>
<tbody>
{% for result in results %}
{% if result.form.non_field_errors %}
    <tr><td colspan="{{ result|length }}">{{ result.form.non_field_errors }}</td></tr>
{% endif %}
<tr class="{% cycle 'row1' 'row2' %} {{ result.class }}">{% for item in result.items %}{{ item }}{% endfor %}</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}

您在模型中添加了一项功能:

@property
def admin_css_class(self):
    return 'my_class'

这是经过测试和运作的。