Меня попросили добавить на сайт администратора проекта Django новый раздел, который будет собирать информацию из нескольких моделей (как это было в представлении базы данных), но мне не разрешено изменять или добавлять таблицы / представления в ДБ.
Проверка похожих вопросов Настраиваемая страница для администратора Django в SO. Я закончил тем, что пытался создать "фальшивую" модель, которая не будет управляться Django, и добавлять собственные URL в методе get_urls
,
Пусть код объяснит себя:
core/admin.py
class ConfigurationOverview(Model):
aa = ForeignKey(ModelA, on_delete=DO_NOTHING)
bb = ForeignKey(ModelB, on_delete=DO_NOTHING)
cc = ForeignKey(ModelC, on_delete=DO_NOTHING)
class Meta:
# Django won't consider this model
managed = False
# link to the index page at /admin
verbose_name = 'Configuration overview'
app_label = 'core'
@staticmethod
def all():
# gather info from ModelA, ModelB, ModelC and create a collection of ConfigurationOverviews
return []
@register(ConfigurationOverview)
class ConfigurationOverviewAdmin(ModelAdmin):
def get_urls(self):
urls = super(ConfigurationOverviewAdmin, self).get_urls()
my_urls = [
url(
r'^$', # /admin/core/configurationoverview/
self.admin_site.admin_view(self.list_view),
name='core_configurationoverview_list'
)
]
return my_urls + urls
def list_view(self, request):
context = {
'configuration_overviews': ConfigurationOverview.all(),
}
return render(request,
"admin/core/configurationoverview/change_list.html",
context)
templates/admin/core/configurationoverview/change_list.html
{% extends "admin/change_list.html" %}
{% block content %}
AAAA
{% endblock %}
Но при получении /admin/core/configurationoverview/
я получаю
NoReverseMatch at /admin/core/configurationoverview/
Reverse for 'app_list' with keyword arguments '{'app_label': ''}' not found. 1
но я определил app_label: core
! любой намек?
* РЕДАКТИРОВАТЬ *
Это пустая миграция, которую я запустил:
class Migration(migrations.Migration):
dependencies = [...]
operations = [
migrations.CreateModel(
name='ConfigurationOverview',
fields=[],
options={
'managed': False,
'verbose_name': 'Configuration overview'
},
),
]