Я хотел получить ту же функциональность для своего сайта и добавил ее, внеся небольшие изменения в базовую систему 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 :
И вот! Это должно выглядеть примерно так:
Edit:
Необязательный шаг 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>