Eu gostaria de fornecer o mesmo conteúdo em 2 arquivos base diferentes.
Então, estou tentando fazer isso:
page1.html:
{% extends "base1.html" %}
{% include "commondata.html" %}
page2.html:
{% extends "base2.html" %}
{% include "commondata.html" %}
O problema é que não consigo usar extends e include. Existe alguma maneira de fazer isso? E se não, como posso realizar o acima?
commondata.html substitui um bloco que é especificado em base1.html e base2.html
O objetivo disso é fornecer a mesma página nos formatos pdf e html, onde a formatação é ligeiramente diferente. A pergunta acima, no entanto, simplifica o que estou tentando fazer, então, se conseguir uma resposta para isso, isso resolverá meu problema.
fonte
Dos documentos do Django:
Assim, o Django não pega nenhum bloco do seu commondata.html e não sabe o que fazer com os blocos externos do HTML renderizado.
fonte
Isso deve funcionar para você: coloque a tag de inclusão dentro de uma seção de bloco.
page1.html:
page2.html:
fonte
Mais informações sobre por que não estava funcionando para mim no caso de ajudar as pessoas futuras:
A razão pela qual não estava funcionando é que {% include%} no django não gosta de caracteres especiais, como apóstrofo extravagante. Os dados do modelo que estava tentando incluir foram colados do Word. Tive que remover manualmente todos esses caracteres especiais e então incluí-los com sucesso.
fonte
Você não pode extrair blocos de um arquivo incluído em um modelo filho para substituir os blocos do modelo pai. No entanto, você pode especificar um pai em uma variável e ter o modelo base especificado no contexto.
Da documentação :
Em vez de separar "page1.html" e "page2.html", coloque
{% extends base_template %}
no topo de "commondata.html". E então, em sua visão, definabase_template
como "base1.html" ou "base2.html".fonte
Adicionado para referência a futuras pessoas que encontrarem isso por meio do google: você pode querer olhar para a tag {% overextend%} fornecida pela biblioteca mezanino para casos como este.
fonte
Editar 10 de dezembro de 2015 : Conforme apontado nos comentários, o ssi está obsoleto desde a versão 1.8. De acordo com a documentação:
Na minha opinião, a (melhor) resposta certa para essa pergunta é a de podshumok , pois explica por que o comportamento de include quando usado junto com a herança.
No entanto, fiquei um tanto surpreso que ninguém mencionou a tag ssi fornecida pelo sistema de modelos Django, que é projetado especificamente para inline, incluindo um pedaço de texto externo . Aqui, inline significa que o texto externo não será interpretado, analisado ou interpolado, mas simplesmente "copiado" dentro do modelo de chamada.
Por favor, consulte a documentação para mais detalhes (certifique-se de verificar sua versão apropriada do Django no seletor na parte inferior direita da página).
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi
Da documentação:
Cuidado também com as implicações de segurança dessa técnica e também com a definição ALLOWED_INCLUDE_ROOTS necessária, que deve ser adicionada aos arquivos de configuração.
fonte