Расширение админки django с помощью представления без модели
У меня есть настраиваемое представление администратора - мое приложение называется virtual
:
class VirtualAdminSite(admin.AdminSite):
index_template = "virtual/admin_index.html"
def index(self, request, extra_context=None):
extra_context = extra_context or {}
return super().index(request, extra_context)
def get_urls(self):
urls = super().get_urls()
my_urls = path("virtual/info/", self.admin_view(self.info))
urls.append(my_urls)
return urls
def info(self, request):
return HttpResponse("hello")
и я хочу иметь возможность включить url во вновь созданный admin_index.html
, поэтому я сделал так
(пожалуйста, не обращайте внимания, что я использовал HTMX для загрузки, потому что это короче, чем AJAX в ванильном JS):
{% block content %}
<div id="content-main">
{% include "admin/app_list.html" with app_list=app_list show_changelinks=True %}
Info: <h3 hx-get="{% url 'info' %}" hx-trigger="load"> loading ... </h3>
</div>
{% endblock %}
но я получаю: Reverse for 'info' not found. 'info' is not a valid view function or pattern name
ошибка.
Я уже пробовал добавлять admin/
в путь и удалять virtual
, но все безуспешно.
If I recall correctly, the .urls
of a site by default pases the url patterns as well as the app_namespace
which is by default admin
, and the instancce namespace, which is the name of the site you attached. Indeed, in the source code [GitHub], we see:
@property def urls(self): return self.get_urls(), "admin", self.name
Таким образом, вы ссылаетесь на вид с:
{% url 'admin:info' %}
Дополнительно необходимо указать имя пути:
my_urls = path('virtual/info/', self.admin_view(self.info), name='info')
Последняя проблема оказалась в том, что вы добавили путь в конец списка, а перед ним есть шаблон "catch all", поэтому его можно вставить перед ним или хотя бы перед "catch all":
def get_urls(self):
urls = super().get_urls()
my_urls = path('virtual/info/', self.admin_view(self.info), name='info')
urls.insert(0, my_urls)
return urls