Più il livello di ereditarietà dei template in Jinja2?

Faccio in html/css, sul commercio, e ho lavorato su e off django progetti come modello di progettazione. Attualmente sto lavorando su un sito che utilizza Jinja2, che ho usato per circa 2 settimane. Ho appena scoperto attraverso la lettura della documentazione che Jinja2 non supporta più il livello di ereditarietà dei template, come non si può fare più di uno

{% 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 quello, e poi costruire la carne delle pagine utilizzando quei template di base. Non è il punto di eredità, in modo da avere più potenza astratta, quindi l’unica davvero che pasticciano con codice univoco?

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

  • Si prega di fornire il link che dice Jinja2 non può fare a più livelli di eredità. Hai provato ad avere un modello di gerarchia? Quali errori hai?
  • jinja.pocoo.org/2/documentation/templates#extends – “non C’è alcun supporto per l’ereditarietà multipla.”
  • Molteplici l’ereditarietà non è la stessa cosa di più livelli di ereditarietà singola. Non vedo alcun supporto per l’ereditarietà multipla in Django, uno. Si prega di fornire alcuni esempi per chiarire se si sta parlando di livelli multipli di eredità o effettivo, e l’ereditarietà multipla.
  • non voglio essere in grado di fare, è di avere un modello di base, hanno 3 o 4 template di base che, e di essere in grado di creare modelli in base a quelli, per offrire la massima flessibilità. Ho avuto l’impressione che avete fatto questo, specificando un estende sul sub template di base, e sui singoli modelli html, che avrebbe potuto, come 2 o più {% extends %} tag e quindi viola la parte di documentazione che dice che si può utilizzare solo un {% extends %} per eseguire il rendering. Forse, giusto o sbagliato, ma dato che è quello che ho chiesto, esiste un modo per fare questo?
  • Si prega di non scrivere commenti estesi sulla tua stessa domanda. Si prega di aggiornare la questione. Si prega di fornire un esempio di quello che si pensa che si vuole fare. Si prega di fornire il problema di avere. Si può avere una gerarchia di modelli di qualsiasi profondità, quindi non capisco che cosa non ha funzionato con la soluzione che si sta cercando di fare il lavoro. Si prega di aggiornare la questione con un esempio di codice.
InformationsquelleAutor Rey | 2009-12-29

 

6 Replies
  1. 27

    Il modo in cui la documentazione e formulato, sembrava che non supporta l’ereditarietà (n) livelli di profondità.

    A differenza di Python Jinja non supporta
    l’ereditarietà multipla. Così si può solo
    hanno un estende tag chiamato per
    il rendering.

    Non sapevo che era solo una regola dicendo 1 si estende per modello…. Ora so, con qualche aiuto da jinja canale irc.

    • Sono contento di vedere è ordinato questo, e mi chiedevo la stessa cosa. Ho pensato la tua domanda originale era abbastanza chiara. Si può essere così fastidioso a che fare con l’ego su StackOverflow, qualcuno di cui sopra deve essere stato molto irritabile, il giorno che hai chiesto questa domanda.
    • Per quel che vale, ho appena distribuito multi-livello di estensione con jinja2 con successo, grazie per questo post, quindi ho base.html poi ampliato con ulteriori base_admin.html, base_client.html, base_form.html, etc. e poi, infine, di estendere loro con le pagine, come accounts.html. Non più la duplicazione del codice!
  2. 23

    Uno dei modi migliori per ottenere di più a livello di template utilizzando jinja2 è quello di utilizzare “include”
    diciamo che si sono ‘base_layout.html‘ come il tuo 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 %}

    e ora la tua pagina può solo extends ‘child_layout.html‘ e avrà sia base_layout.html e child_layout.html

    {% extends "child_layout.html" %}
    {% block body %}
      ...// write your code here
    {% endblock %}
    • se non mi sbaglio il problema di includere, è che carica il file html, anche se non vi è alcuna necessità per il file o anche se l’utente non ha fatto una richiesta. Ma il vantaggio si estende è che il file html viene eseguito il rendering su richiesta. che farà risparmiare tempo per il caricamento dell’intera pagina, soprattutto quando ci sono un sacco di file html con enorme codici
  3. 5

    Provare 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 chiamare con

    env = Environment(loader=FileSystemLoader(os.path.join(path, "Layouts")))
    template = env.get_template('content.html')
    html = template.render()
    print html
    • a questa domanda ha ancora un sacco di vita di sinistra in esso, anche 5 anni dopo! Abbastanza divertente.
    • Perché avete bisogno di un blocco a piè di pagina se suo essere incluso?
  4. 4

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

    Ho avuto un base.html file che ha il blocco dei contenuti e per esteso dal manage.html. e che manage.html ha un blocco sub_manage che si estende da internet_market.html così visivamente sembra:

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

    quando ho reso, everythink ha funzionato bene, il che significa che è possibile avere diversi {% extends %} in uno di rendering. l’unica cosa è che se si utilizza collegamenti relativi al file css o js file, allora è possibile che non funzioni, ma quello di render, ma non troverete il vostro file css/js.
    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 i 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">
  5. 3

    Vedere la documentazione estensione, tra, e importazione.

    Ciò consente di ottenere funzionalità da più file per scopi diversi ed è diversa dalle profondità di annidamento.
    È perfettamente possibile avere un modello che si estende per un modello che estende il modello…

  6. 1

    È possibile utilizzare il seguente metodo per combinare diversi contenuti in un singolo layout.html per vari layout design:

    {% if instance == 'type1' %}
    
    {% elif instance == 'type2' %}
    
    {% else %}
    
    {% endif %}

    …e chiamare:

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

    in codice python.

Lascia un commento