Django: создайте раздел администратора, собирающий информацию от нескольких моделей - PullRequest
0 голосов
/ 24 апреля 2019

Меня попросили добавить на сайт администратора проекта 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'
            },
        ),
    ]

1 Ответ

0 голосов
/ 24 апреля 2019

Вы можете попытаться добавить обычный вид и потребовать, чтобы пользователь был сотрудником.

views.py

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def configuration_overview(request):
    aa = ModelA.objects.all() # customize this queryset if neccesary, paginate ...
    bb = ModelB.objects.all() # customize this queryset if neccesary, paginate ...
    cc = ModelC.objects.all() # customize this queryset if neccesary, paginate ...

    return render(request, 'admin/core/configurationoverview/change_list.html', context={'aa': aa, 'bb': bb, 'cc': cc})

urls.py

urlpatterns = [
    ###
    path('admin/configuration', views.configuration_overview) # customize the path you want
    ###
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...