Como substituir um modelo de administrador (por exemplo, admin / index.html) e ao mesmo tempo estendê-lo (consulte https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing -um-admin-template )?
Primeiro - eu sei que essa pergunta já foi feita e respondida antes (consulte Django: Substituindo E estendendo um modelo de aplicativo ), mas como a resposta diz que não é diretamente aplicável se você estiver usando o carregador de modelos app_directories (que é a maioria dos Tempo).
Minha solução atual é fazer cópias e estender a partir delas, em vez de estender diretamente dos modelos de administrador. Isso funciona muito bem, mas é realmente confuso e adiciona trabalho extra quando os modelos de administrador são alterados.
Poderia pensar em uma tag de extensão personalizada para os modelos, mas não quero reinventar a roda se já existir uma solução.
Em uma nota lateral: Alguém sabe se este problema será resolvido pelo próprio Django?
fonte
Respostas:
Atualização :
Leia o Docs para sua versão do Django. por exemplo
https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#admin-overriding-templates https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#admin-overriding -modelos
Resposta original de 2011:
Eu tive o mesmo problema há cerca de um ano e meio e encontrei um bom carregador de modelos no djangosnippets.org que facilita isso. Ele permite que você estenda um modelo em um aplicativo específico, permitindo que você crie seu próprio admin / index.html que estende o modelo admin / index.html do aplicativo de administração. Como isso:
Eu dei um exemplo completo de como usar esse carregador de modelos em uma postagem do blog no meu site.
fonte
django-apptemplates
se ele parar de funcionar um dia.Quanto ao Django 1.8 ser a versão atual, não há necessidade de ligar novamente, copiar o admin / templates para a pasta do projeto ou instalar middlewares, conforme sugerido pelas respostas acima. Aqui está o que fazer:
crie a seguinte estrutura em árvore (recomendada pela documentação oficial )
Nota : A localização deste arquivo não é importante. Você pode colocá-lo dentro do seu aplicativo e ele ainda funcionará. Desde que sua localização possa ser descoberta pelo django. O que é mais importante é que o nome do arquivo HTML deve ser o mesmo que o nome original do arquivo HTML fornecido pelo django.
Adicione este caminho de modelo às suas configurações.py :
Identifique o nome e o bloco que você deseja substituir. Isso é feito olhando para o diretório admin / templates do django. Estou usando o virtualenv, então, para mim, o caminho está aqui:
Neste exemplo, desejo modificar o formulário Adicionar novo usuário. O modelo responsável por esta visualização é change_form.html . Abra o change_form.html e localize o {% block%} que deseja estender.
Em seu change_form.html , escreva algo assim:
Carregue sua página e você verá as alterações
fonte
../
para "expandir" o caminho e especificar o caminho original mais exclusivo{% extends "../../admin/templates/admin/index.html" %}
. link para respostase você precisar sobrescrever o
admin/index.html
, poderá definir o parâmetro index_template doAdminSite
.por exemplo
e coloque seu modelo em
<appname>/templates/admin/my_custom_index.html
fonte
{% extends "admin/index.html" %}
my_custom_index.html e faça referência ao modelo de administração do django sem copiá-lo. Obrigado.Com
django
1.5 (pelo menos), você pode definir o modelo que deseja usar para um determinadomodeladmin
consulte https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options
Você pode fazer algo como
Por
change_form.html
ser um modelo html simples que se estendeadmin/change_form.html
(ou não, se você quiser fazê-lo do zero)fonte
A resposta de Chengs está correta, mas, de acordo com os documentos do administrador, nem todos os modelos de administrador podem ser substituídos da seguinte maneira: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#overriding-admin-templates
Eu tive que sobrescrever o login.html do administrador e, portanto, tive que colocar o modelo sobrescrito nessa estrutura de pastas:
(sem a subpasta myapp no admin) Não tenho repugnância suficiente para comentar sobre o post de Cheng, por isso tive que escrever isso como nova resposta.
fonte
A melhor maneira de fazer isso é colocar os modelos de administração do Django dentro do seu projeto. Portanto, seus modelos estariam dentro
templates/admin
dos modelos de administração do Djangotemplate/django_admin
. Em seguida, você pode fazer algo como o seguinte:templates / admin / change_form.html
Se você está preocupado em manter os modelos de ações atualizados, pode incluí-los com svn externals ou similar.
fonte
--ignore
argumento commakemessages
. Veja: docs.djangoproject.com/en/dev/ref/django-admin/#makemessagesNão consegui encontrar uma única resposta ou uma seção nos documentos oficiais do Django que tinham todas as informações necessárias para substituir / estender os modelos de administrador padrão. Por isso, estou escrevendo essa resposta como um guia completo, esperando que seja útil para outros no futuro.
Assumindo a estrutura padrão do projeto Django:
Aqui está o que você precisa fazer:
Em
mysite/admin.py
, crie uma subclasse deAdminSite
:Certifique-se de importar
custom_admin_site
osadmin.py
aplicativos e registrar seus modelos nele para exibi-los em seu site de administração personalizado (se desejar).Em
mysite/apps.py
, crie uma subclasse deAdminConfig
e definadefault_site
paraadmin.CustomAdminSite
a etapa anterior:Em
mysite/settings.py
, substituirdjango.admin.site
emINSTALLED_APPS
comapps.CustomAdminConfig
(o administrador personalizado aplicativo de configuração da etapa anterior).Em
mysite/urls.py
, substituaadmin.site.urls
do URL do administrador paracustom_admin_site.urls
Crie o modelo que você deseja modificar em seu
templates
diretório, mantendo a estrutura de diretório padrão dos modelos de administração do Django, conforme especificado nos documentos . Por exemplo, se você estava modificandoadmin/index.html
, crie o arquivotemplates/admin/index.html
.Todos os modelos existentes podem ser modificados dessa maneira, e seus nomes e estruturas podem ser encontrados no código fonte do Django .
Agora você pode substituir o modelo escrevendo-o do zero ou estendendo-o e, em seguida, substituindo / estendendo blocos específicos.
Por exemplo, se você deseja manter tudo como está, mas deseja substituir o
content
bloco (que na página de índice lista os aplicativos e seus modelos registrados), adicione o seguinte atemplates/admin/index.html
:Para preservar o conteúdo original de um bloco, adicione
{{ block.super }}
onde quiser que o conteúdo original seja exibido:Você também pode adicionar estilos e scripts personalizados, modificando os blocos
extrastyle
eextrahead
.fonte
Eu concordo com Chris Pratt. Mas acho que é melhor criar o link simbólico para a pasta original do Django, onde os modelos de administração estão:
e como você pode ver, depende da versão do python e da pasta onde o Django instalou. Portanto, no futuro ou em um servidor de produção, talvez seja necessário alterar o caminho.
fonte
Este site tinha uma solução simples que funcionava com a minha configuração do Django 1.7.
PRIMEIRO: Crie um link simbólico chamado admin_src no diretório / template do seu projeto para os modelos Django instalados. Para mim no Dreamhost usando um virtualenv, meus modelos de administração do Django "fonte" estavam em:
SEGUNDO: Crie um diretório administrativo em templates /
Portanto, o diretório / modelo do meu projeto agora fica assim:
TERCEIRO: No seu novo diretório template / admin /, crie um arquivo base.html com este conteúdo:
QUARTA: Adicione seu admin favicon-admin.ico na sua pasta estática de img raiz.
Feito. Fácil.
fonte
para o índice do aplicativo, adicione esta linha a um arquivo py em algum lugar comum, como url.py
para índice de módulo de aplicativo: adicione esta linha ao admin.py
para lista de alterações: adicione esta linha à classe admin:
para modelo de formulário do módulo de aplicativo: adicione esta linha à sua classe de administrador
etc. e encontre outros nas mesmas classes de módulos do administrador
fonte
Você pode usar o django-overextends , que fornece herança circular de modelos para o Django.
Ele vem do Mezzanine CMS, de onde Stephen o extraiu para uma extensão autônoma do Django.
Mais informações que você encontra em "Substituindo modelos extensíveis" (http: /mezzanine.jupo.org/docs/content-architecture.html#overriding-vs-extending-templates) nos documentos do Mezzanine.
Para informações mais aprofundadas, consulte o Stephens Blog "Herança de modelo circular para Django" (http: /blog.jupo.org/2012/05/17/circular-template-inheritance-for-django).
E nos Grupos do Google a discussão (https: /groups.google.com/forum / #! Topic / mezzanine-users / sUydcf_IZkQ) que iniciou o desenvolvimento desse recurso.
Nota:
Não tenho reputação de adicionar mais de 2 links. Mas acho que os links fornecem informações interessantes. Então, deixei de fora uma barra após "http (s):". Talvez alguém com melhor reputação possa reparar os links e remover esta nota.
fonte