Domanda

Lo faccio html / css di mestiere, e ho lavorato dentro e fuori progetti Django come designer modello. Attualmente sto lavorando su un sito che utilizza Jinja2, che ho utilizzato per circa 2 settimane. Ho appena scoperto attraverso la lettura della documentazione che Jinja2 non supporta l'ereditarietà multipla modello di livello, come in non si può fare più di un

{% extends "foo" %}

per il rendering. Ora sono abbastanza sicuro che si può fare questo in Django, che è potente perché è possibile specificare un modello di base, specificare 3 o 4 modelli basati su questo, e poi costruire la carne delle vostre pagine utilizzando quei modelli di base. non è il punto di eredità in modo da avere più potere di astrarre così il vostro veramente solo scherzi con codice univoco?

In ogni caso non ho alcuna idea di cosa fare qui. Non so se c'è qualche modo per farlo che funziona come pure esso potrebbe con i modelli di Django. Non sono esattamente un esperto sia a Django o Jinja (2), ma posso fornire tutte le informazioni necessarie.

È stato utile?

Soluzione

Il modo in cui la documentazione formulata esso, sembrava che non supporta l'ereditarietà (n) livelli di profondità.

  

A differenza di Python Jinja non supporta   ereditarietà multipla. Così solo si può   avere uno estende tag chiamato per   rendering.

Non sapevo che era solo una regola dicendo 1 si estende per ogni modello .... ora so, con qualche aiuto dal canale IRC Jinja.

Altri suggerimenti

Uno dei modi migliori per raggiungere il livello multiplo di template usando Jinja2 è quello di utilizzare 'includere' Diciamo che avete ' base_layout.html ' come modello di base

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

e poi si desidera avere ' child_layout.html ' che si estende 'base_layout.

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

ed ora la tua pagina può semplicemente estende ' child_layout.html ' e avrà sia base_layout.html e child_layout.html

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

Prova questo, questo lavoro per me, grazie a @Ixm risposta.

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 confermare con

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

Di recente ho affrontato lo stesso problema. Ho voluto ereditare diversi template figli e ha funzionato. Per illustrare lo vorrei mostrarvi una soluzione che ha funzionato per me:

ho avuto un file base.html che ha un contenuto di blocco e prorogato di manage.html. e che ha un manage.html sub_manage blocco che si estende da internet_market.html, così visivamente assomiglia:

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

quando ho reso, everythink funzionava bene, il che significa che si può avere diversi {% extends%} in un rendering. l'unica cosa è che se si utilizza collegamenti relativi al vostro CSS o file js allora potrebbe non funzionare, anzi renderà, ma non troverete i file js css /. come:

<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>

In questo caso è necessario utilizzare collegamenti dinamici utilizzando url_for. come:

<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">

Vedere la documentazione estende , compresi, e importazione .

In questo modo i mezzi di ottenere funzionalità da più file per scopi diversi ed è diversa dalla profondità della nidificazione. Si può perfettamente avere un modello che si estende un modello che si estende un modello ...

È possibile utilizzare il seguente modo di combinare contenuti diversi in un unico layout.html per vari disegni di layout:

{% if instance == 'type1' %}

{% elif instance == 'type2' %}

{% else %}

{% endif %}

... e chiamata:

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

nel codice python.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top