Pergunta

Sou um desenvolvedor front-end e tenho tentado usar o Jinja2 de maneira eficaz.Quero ajustar um site atual para que ele tenha vários modelos básicos usando herança, use tags de bloco para substituir o conteúdo e substituí-lo e use macros para suportar a passagem de argumentos.

Meu modelo base contém este código (editado para simplificar):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
{% from "foo.html" import macro1, macro2, macro3 %}
{% macro base_template(title=none, arg2=none, urls={}, arg3=false) %}
<html>
  <title>{{ title }} | Site.com</title>
  ....
  {{ caller() }}
  ....
</html>
{% endmacro %}

{% block content %}{% endblock %}

E minhas páginas que o estendem ficam assim:

{% extends "base.html" %}
{% block content %}
{% call base_template(title="home", arg2="active", arg3="true") %}
(html code here)
{% endcall %}
{% endblock %}

Então basicamente todas as páginas estendem a base, elas chamam uma macro e passam argumentos para essa macro.Não entendo tudo muito bem, mas o ponto principal é que isso permite valores padrão e um grau de flexibilidade que não requer a redefinição de um bloco inteiro:dá algum grau de flexibilidade e poder.Novamente, isso é bastante simplificado.

O único problema é que isso anula minha capacidade de usar blocos.As macros são para flexibilidade, mas com blocos, tenho a capacidade de substituir algo completamente ou usar o conteúdo dos pais e adicioná-lo, o que não posso fazer com macros (pelo menos não acho).O problema é que não consigo agrupar as coisas em blocos, caso contrário eles não verão os valores na macro.Por exemplo, fazendo isso:

{% block title %}<title>{{ title }} | Site.com</title>{% endblock %}

Falhará porque dirá que o título é indefinido.

Em última análise, estou procurando uma maneira de utilizar o poder e os aspectos organizacionais dos blocos, mas ainda ser capaz de utilizar a lógica e a concisão das macros.Se alguém pudesse me dar alguma ajuda sobre como eu poderia resolver esse problema, eu realmente apreciaria.

Foi útil?

Solução

Os blocos só podem ser definidos no nível superior do modelo.Se você estender um modelo, quaisquer valores definidos no modelo filho usando um set tag estará acessível a partir do modelo que está estendendo.Por exemplo, se você tiver um modelo chamado layout.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
  <title>{{ title }} | Site.com</title>
  ....
  {% block content %}{% endblock content %}
  ....
</html>

E você tem esse modelo filho, index.html:

{% extends "layout.html" %}
{% set title = 'Homepage' %}
{% block content %}
(html code here)
{% endblock content %}

Então a referência a title no pai resolveria 'Homepage'.Você pode fazer isso com qualquer tipo de variável.Para o que você está fazendo, não acho que haja necessidade de macros - se você aproveitar esse recurso e posicionar bem os blocos, poderá fazer praticamente tudo o que precisa em termos de layouts. .Eu daria uma olhada em alguns dos modelos usados ​​por Plurk Consolo, que foi escrito por um dos autores do Jinja2, se você quiser ter uma boa ideia de quando usar vários recursos do Jinja2.

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