Importante: remova a \
no meio das tags.
Se você olhar em
https://github.com/django/django/tree/main/django/contrib/admin/templates/admin
verá todos os templates usados no Admin.
Na pasta da virtualenv do seu projeto também.
Copy ls -l .venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/
cat .venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list.html
Copy myproject
├── core
│ ├── templates
│ │ ├── admin
│ │ │ ├── base_site.html
│ │ │ ├── login.html
│ │ │ ├── core
│ │ │ │ ├── article
│ │ │ │ │ └── change_list.html
│ │ │ │ └── change_list.html
Então vamos criar nossas pastas
Copy mkdir -p myproject/core/templates/admin/core/article
Agora vamos criar o primeiro change_list.html
Copy touch myproject/core/templates/admin/core/change_list.html
E seu conteúdo será:
Copy {\% extends "admin/change_list.html" %}
{\% block object-tools-items %}
{{ block.super }}
<li>
<a href="botao-da-app/">
Novo botão
</a>
</li>
{\% endblock %}
Depois
Copy touch myproject/core/templates/admin/core/article/change_list.html
Com o conteúdo:
Copy {\% extends "admin/change_list.html" %}
{\% block object-tools-items %}
{{ block.super }}
<li>
<a href="botao-artigo/">
Botão do Artigo
</a>
</li>
{\% endblock %}
Para que o Django Admin reconheça esses templates precisamos configurar o settings.py
Copy # settings.py
TEMPLATES = [
{
...
'DIRS': [
BASE_DIR,
os.path.join(BASE_DIR, 'templates')
],
...
},
]
Agora edite admin.py
Copy from django.contrib import admin, messages
# admin.py
from django.shortcuts import redirect
from django.urls import path
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
...
def get_urls(self):
urls = super().get_urls()
my_urls = [
path(
'botao-artigo/',
self.admin_site.admin_view(self.minha_funcao, cacheable=True)
),
]
return my_urls + urls
def minha_funcao(self, request):
print('Ao clicar no botão, faz alguma coisa...')
messages.add_message(
request,
messages.INFO,
'Ação realizada com sucesso.'
)
return redirect('admin:core_article_changelist')
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
...
def get_urls(self):
urls = super().get_urls()
my_urls = [
path(
'botao-da-app/',
self.admin_site.admin_view(self.minha_funcao_category, cacheable=True)
),
]
return my_urls + urls
def minha_funcao_category(self, request):
print('Ao clicar no botão, faz alguma coisa em category...')
messages.add_message(
request,
messages.INFO,
'Ação realizada com sucesso.'
)
return redirect('admin:core_category_changelist')
Sobreescrevendo a tela de login do Admin
A partir daí podemos fazer
Copy # admin.py
admin.site.login_template = 'myproject/core/templates/admin/login.html'
Vendo
Copy cat .venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/login.html
cat .venv/lib/python3.8/site-packages/django/contrib/admin/templates/admin/base_site.html
E nos templates
Copy touch myproject/core/templates/admin/login.html
Copy <!-- myproject/core/templates/admin/login.html -->
{\% extends "admin/login.html" %}
{\% load static %}
{\% block branding %}
<h1 id="site-name">
<a href="{\% url 'admin:index' %}">
<img src="{\% static 'img/django-logo-negative.png' %}" alt="django-logo-negative.png" width="100px">
</a>
</h1>
{\% endblock %}
{\% block extrastyle %}
{{ block.super }}
<link rel="stylesheet" type="text/css" href="{\% static "css/login.css" %}" />
{{ form.media }}
{\% endblock %}
E pra caprichar no CSS
Copy /* myproject/core/static/css/login.css */
body.login {
background: url("../img/headset.jpg") no-repeat center center;
background-size: 100% auto;
}
html {
min-height: 100%;
}
https://www.djangoadmintutorials.com/how-to-customize-django-admin-login-page/
Basta criar base_site.html
Copy touch myproject/core/templates/admin/base_site.html
Copy {\% extends "admin/base_site.html" %}
{\% load static %}
{\% block branding %}
<h1 id="site-name">
<a href="{\% url 'admin:index' %}">
<img src="{\% static 'img/django-logo-negative.png' %}" alt="django-logo-negative.png" width="70px">
</a>
</h1>
{\% endblock %}
Importante: mude a ordem das apps
em settings.py
Copy # settings.py
INSTALLED_APPS = [
'myproject.core',
'django.contrib.admin',
...
]
https://books.agiliq.com/projects/django-admin-cookbook/en/latest/logo.html