自定义Django管理员索引页面以显示模型对象

Nav*_*ava 10 django templates django-models django-admin

在Django管理员索引页面中,通常会列出应用程序及其模型.如何在此索引页中列出模型对象?我想要显示其模型对象,而不是只显示应用程序.应如何定制?

在此输入图像描述

Set*_*dor 14

我想为我的网站提供相同的功能,并通过对核心django系统稍作修改来添加它.

第1步: 首先,我们需要一种方法来指出哪些模型应列出其属性.将以下代码添加到您希望列出实例的模型中(在models.py中):

class Meta:
    list_instances = True
Run Code Online (Sandbox Code Playgroud)

第2步: 我们需要修改Django以识别和读取这个新属性.在core-django文件中:db/models/options.py,大致在第22行将'list_instances'附加到DEFAULT_NAMES:

DEFAULT_NAMES = ('verbose_name', 'verbose_name_plural', 'db_table', 'ordering',
             'unique_together', 'permissions', 'get_latest_by',
             'order_with_respect_to', 'app_label', 'db_tablespace',
             'abstract', 'managed', 'proxy', 'auto_created', 'list_instances')
Run Code Online (Sandbox Code Playgroud)

并且在同一文件中,大致在第52行,在其他属性之后立即为此属性创建默认字段:

self.list_instances = False
Run Code Online (Sandbox Code Playgroud)

第3步:我们需要将此信息传递给生成索引页面的模板.在core-django文件中:contrib/admin/sites.py,在index()方法内部和"if has_module_perms:"部分中,添加以下代码:

instances = []
if (model._meta.list_instances == True):
    instances = model_admin.queryset(None)
Run Code Online (Sandbox Code Playgroud)

这将创建要显示的实例列表,但仅限于设置了list_instance属性.在同一个文件中,向下几行,将这些值附加到"model_dict"构造中.

model_dict = {
    'name': capfirst(model._meta.verbose_name_plural),
    'admin_url': mark_safe('%s/%s/' % (app_label, model.    __name__.lower())),
    'perms': perms,
    'list_instances':model._meta.list_instances,
    'instances': instances,
}
Run Code Online (Sandbox Code Playgroud)

第4步:最后一步是修改模板以支持这一点.编辑core-django文件/contrib/admin/templates/admin/index.html或将此文件复制到特定应用程序的templates/admin /目录.在生成行的标准代码后添加几行,以生成"子行"(如果适用).大约在第40行,在"/ tr>"和"{%endfor%}"之间:

{% if model.list_instances %}
    {% for instance in model.instances %}
    <tr>
        <td colspan="2" style="padding-left: 2em;">{{ instance }}</td>
        {% if model.perms.change %}
            <td><a href="{{ model.admin_url }}{{ instance.id }}/" class="changelink">{% trans 'Change' %}</a></td>
        {% else %}
            <td>&nbsp;</td>
        {% endif %}
    </tr>
    {% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

这将导致项目列出模型中由unicode()方法生成的名称.

第五步:看见!它应该看起来像这样:

在此输入图像描述

编辑: 可选步骤6:如果您希望实例名称也可以单击,只需更改模板(index.html)并替换:

<td colspan="2" style="padding-left: 2em;">{{ instance }}</td>
Run Code Online (Sandbox Code Playgroud)

有:

<td colspan="2" style="padding-left: 2em;">        
    {% if model.perms.change %}            
        <a href="{{ model.admin_url }}{{ instance.id}}">{{ instance }}</a>
    {% else %}
        {{ instance }}
    {% endif %}
</td>
Run Code Online (Sandbox Code Playgroud)

  • 没问题.:)我也需要它.如果您在单击特定应用时也想要它,请再次转到contrib/admin/sites.py,并将index()方法中的相同行添加到app_index()方法中. (2认同)
  • 好消息.是否可以在不修改核心文件的情况下执行此操作,如步骤2和3中所示 - 例如,有没有办法对其进行修补? (2认同)