Как настроить «пользовательский сайт» Django Unfold с обязательным параметром URL?

Я пытаюсь создать «пользовательский сайт» с помощью Django Unfold. У меня есть существующая панель администратора, настроенная с использованием более базового подхода ModelAdmin, которая прекрасно работает. Однако мне нужно создать отдельную панель администратора, используя функцию «пользовательский сайт» для использования с django-арендаторами. Я хочу, чтобы структура URL выглядела так: http://localhost:8000/tenant-admin/$tenant-id/. В рамках «пользовательского сайта» Django Tenants будет определять путь поиска Postgres для правильной схемы Postgres, и администратор сможет управлять всеми моделями для данного арендатора.

Я определил свой пользовательский сайт следующим образом:

from django.contrib import admin
from django.urls import path
from unfold.sites import UnfoldAdminSite
from unfold.admin import ModelAdmin
from tenant_app.models import Foo


class TenantAdminSite(UnfoldAdminSite):
    # hopefully not needed -- but this is the first instance of admin:index causing problems
    # index_template = "admin/dashboard.html"

    def get_app_list(self, *args, **kwargs):
        # this lives at apps/tenant_app and is the only app that this TenantAdminSite
        # will use. Not sure if strings are valid here?
        return ["tenant_app"]

    def get_urls(self):
        """
        Add custom URLs to the default admin site, capturing the tenant name.
        """
        from django.urls import reverse

        # Capture the tenant name as part of the URL
        urls = super().get_urls()

        # Add custom URL pattern to handle the index view based on tenant
        custom_urls = [
            path(
                "/tenant-admin/<tenant_name>/", self.index_view, name="index"
            ),  # Tenant-specific index
        ]

        return custom_urls + urls

    def index_view(self, request, tenant_name):
        """
        A custom view for the index page of the admin, taking the tenant name into account.
        """
        # Use django-tenants' tenant context for the tenant-specific admin
        from django_tenants.utils import tenant_context
        with tenant_context(tenant_name):
            context = self.each_context(request)
            return self.render_to_response(context)

    def index(self, request, schema_name, extra_context={}):
        self.schema_name = schema_name
        return super().index(request, extra_context)


tenant_admin_site = TenantAdminSite(name="tenant_admin_site")


@admin.register(Foo, site=tenant_admin_site)
class FooAdmin(ModelAdmin):
    model = Foo

... и urls.py как:

...
path("tenant-admin/<str:schema_name>/", tenant_admin_site.urls),
...

Посещение сайта http://localhost:8000/tenant-admin/01949409-daa3-77e0-b367-229cb0ded71a/ теперь приводит к следующей ошибке, которая возникает, когда шаблон пытается создать URL с помощью url admin:index:

Reverse for 'index' with no arguments not found. 2 pattern(s) tried: ['tenant\\-admin/(?P<schema_name>[^/]+)/\\Z', 'tenant\\-admin/(?P<schema_name>[^/]+)//tenant\\-admin/(?P<tenant_name>[^/]+)/\\Z']

Я в некоторой растерянности от того, как действовать дальше. Я пробовал переопределить все, казалось бы, подходящие методы в подклассе сайта и попытаться определить значение индекса, но... возможно, я просто принципиально не понимаю, как или если такой подход может работать.

Окружение:

  • Python 3.13
  • Django 5 (последняя версия)
  • unfold 0.45.0
        custom_urls = [
            path(
                "/tenant-admin/<tenant_name>/", self.index_view, name="index"
            ),  # Tenant-specific index
        ]

отредактируйте эту строку :

    "<str:tenant_name>/"
Вернуться на верх