在Django管理员索引页面中,通常会列出应用程序及其模型。如何在此索引页中列出模型对象?我想要显示其模型对象,而不是只显示应用程序。应该如何定制?
答案 0 :(得分:14)
我想为我的网站提供相同的功能,并通过对核心django系统稍作修改来添加它。
第1步: 首先,我们需要一种方法来指出哪些模型应该列出其属性。将以下代码添加到您希望列出实例的模型中(在models.py中):
class Meta:
list_instances = True
第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')
并在同一个文件中,大致在第52行,在其他属性之后立即为此属性创建默认字段:
self.list_instances = False
第3步: 我们需要将此信息传递给生成索引页面的模板。在core-django文件中:contrib / admin / sites.py,在index()方法内部和“if has_module_perms:”部分中,添加以下代码:
instances = []
if (model._meta.list_instances == True):
instances = model_admin.queryset(None)
这将创建要显示的实例列表,但前提是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,
}
第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> </td>
{% endif %}
</tr>
{% endfor %}
{% endif %}
这将导致项目列出模型中 unicode ()方法生成的名称。
第5步: 瞧,看哪!看起来应该是这样的:
编辑: 可选第6步: 如果您希望实例名称也可以单击,只需更改模板(index.html)并替换:
<td colspan="2" style="padding-left: 2em;">{{ instance }}</td>
使用:
<td colspan="2" style="padding-left: 2em;">
{% if model.perms.change %}
<a href="{{ model.admin_url }}{{ instance.id}}">{{ instance }}</a>
{% else %}
{{ instance }}
{% endif %}
</td>
答案 1 :(得分:1)
您可以通过更改各种管理模板来完成此操作 - 根管理模板称为app_index.html
并控制在那里显示的内容。调查发生了什么的最好方法是安装django-debug-toolbar,然后查看每个视图使用的模板,以找出如何自定义。
答案 2 :(得分:1)
更新django 10的Setomidor答案
总是很高兴回到这个干净的解决方案!
第2步 - 它在第125行(是52)附近
第3步 - 在sites.py中 - 更新新方法 -
_build_app_dict
for循环中的:for model, model_admin in models.items():
在线430和460周围添加步骤3
instances = []
if (model._meta.list_instances == True):
instances = model_admin.get_queryset(None)