Pergunta

Eu faço HTML/CSS por profissão e tenho trabalhado em projetos Django como designer de modelos. Atualmente, estou trabalhando em um site que usa o Jinja2, que uso há cerca de 2 semanas. Acabei de descobrir lendo a documentação que o Jinja2 não suporta a herança de modelo de nível múltiplo, pois você não pode fazer mais de um

{% extends "foo" %}

por renderização. Agora, tenho certeza de que você pode fazer isso no Django, o que é poderoso porque você pode especificar um modelo base, especificar 3 ou 4 modelos com base nisso e, em seguida, construir a carne de suas páginas usando esses modelos de base. Não é o objetivo da herança, então você tem mais poder para abstrair, então você está realmente mexendo com código exclusivo?

De qualquer forma, não tenho idéia do que fazer aqui. Não sei se há alguma maneira de fazer isso que funcionará o melhor que poderia com os modelos do Django. Não sou exatamente um especialista em Django ou Jinja (2), mas posso fornecer qualquer informação necessária.

Foi útil?

Solução

A maneira como a documentação o escreveu, parecia que não suportou os níveis de herança (n) de profundidade.

Ao contrário do Python Jinja não suporta herança múltipla. Portanto, você só pode ter uma tag estendida chamada por renderização.

Eu não sabia que era apenas uma regra dizendo que 1 se estende por modelo ... agora eu sei, com alguma ajuda do canal Jinja IRC.

Outras dicas

Uma das melhores maneiras de alcançar vários níveis de modelos usando o Jinja2 é usar 'incluir', digamos que você tenha 'base_layout.html'Como seu modelo base

<!DOCTYPE html>
<title>Base Layout</title>
<div>
  <h1>Base</h1>
  .... // write your code here
  {% block body %}{% endblock %}
</div>

E então você quer ter 'child_layout.html'Isso estende' base_layout.

{% include "base_layout.html" %}
  <div>
  ... // write your code here
  </div>
{% block body %}{% endblock %}

E agora sua página pode apenas se estender 'child_layout.html'E terá os dois base_layout.html e child_layout.html

{% extends "child_layout.html" %}
{% block body %}
  ...// write your code here
{% endblock %}

Tente isso, este trabalho para mim graças à resposta @ixm.

base.html

<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
      {% block content %}{% endblock %}
    </body>
</html>

Content.html

{% extends "base.html" %}
{% block content %}
<table>
  <tr>
  {% include "footer.html" %}
  </tr>
</table>
{% endblock %}

Footer.html

{% block footer %} <td> test</td>{% endblock %}

e ligue com

env = Environment(loader=FileSystemLoader(os.path.join(path, "Layouts")))
template = env.get_template('content.html')
html = template.render()
print html

Recentemente, enfrentei o mesmo problema. Eu queria herdar vários modelos de crianças e funcionou. Para ilustrá -lo, gostaria de mostrar uma solução que funcionou para mim:

Eu tinha um arquivo base.html que possui conteúdo de bloco e estendido pelo gerenciamento.html. e que gerencia.html possui um sub_manage bloco que é estendido por internet_market.html, então visualmente parece:

|- base.html (block content)
|--manage.html (extends base.html)
|---sub_manage.html (extends manage.html)

Quando eu o renderizei, tudo o que funcionou bem, o que significa que você pode ter vários { % estende %} em uma renderização. A única coisa é que, se você estiver usando links relativos para seus arquivos CSS ou JS, ele pode não funcionar, mas não encontrará seus arquivos CSS/JS. Curti:

<head>  
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap.min.css">
<script type="text/javascript" src="../static/js/bootstrap.min.js"></script>
<style type="text/css">
</head>

Nesse caso, você deve usar links dinâmicos usando url_for. Curti:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="{{url_for("static", filename = "css/bootstrap.min.css")}}">
<script type="text/javascript" src="{{url_for("static", filename = "js/bootstrap.min.js")}}"></script>
<style type="text/css">

Veja a documentação estendendo -se, Incluindo, e importação.

Isso fornece os meios de obter a funcionalidade de vários arquivos para diferentes fins e é diferente da profundidade do ninho. Você pode ter um modelo perfeitamente que estende um modelo que estende um modelo ...

Você pode usar a seguinte maneira de combinar diferentes conteúdos em um único layout.html para vários designs de layout:

{% if instance == 'type1' %}

{% elif instance == 'type2' %}

{% else %}

{% endif %}

... e ligue:

render_template('layout', instance='%s' % instance)

no código Python.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top