Domanda

Vorrei fornire lo stesso contenuto in 2 file di base diversi.

Quindi sto cercando di fare questo:

page1.html:

{% extends "base1.html" %}
{% include "commondata.html" %}

page2.html:

{% extends "base2.html" %} 
{% include "commondata.html" %}

Il problema è che non riesco a usare sia l'estensione che l'inclusione. C'è un modo per farlo? E se no, come posso realizzare quanto sopra?

commondata.html sovrascrive un blocco specificato in base1.html e base2.html

Lo scopo è quello di fornire la stessa pagina in formato pdf e html, in cui la formattazione è leggermente diversa. La domanda di cui sopra semplifica ciò che sto cercando di fare, se posso ottenere una risposta a ciò risolverà il mio problema.

È stato utile?

Soluzione

Quando si utilizza il tag del modello di estensione, si sta dicendo che il modello corrente ne estende un altro, ovvero un modello figlio, dipendente da un modello principale. Django guarderà il modello del tuo bambino e userà il suo contenuto per popolare il genitore.

Tutto ciò che vuoi usare in un modello figlio dovrebbe essere all'interno di blocchi, che Django usa per popolare il genitore. Se vuoi usare un'istruzione include in quel modello figlio, devi metterla in un blocco, affinché Django abbia un senso. Altrimenti non ha senso e Django non sa cosa farsene.

La documentazione di Django contiene alcuni esempi davvero validi dell'uso dei blocchi per sostituire i blocchi nel modello principale.

https://docs.djangoproject.com/en / dev / ref / templates / lingua / # template-eredità

Altri suggerimenti

Dai documenti di Django:

  

Il tag include dovrebbe essere considerato come un'implementazione di "rendere questo subtemplate e includere l'HTML", non come "analizzare questo subtemplate e includerne il contenuto come se fosse parte del parent". Ciò significa che non esiste uno stato condiviso tra i modelli inclusi: ogni inclusione è un processo di rendering completamente indipendente.

Quindi Django non prende nessun blocco da commondata.html e non sa cosa fare con i rendering di blocchi HTML esterni.

Questo dovrebbe fare al caso tuo: inserisci tag include all'interno di una sezione di blocco.

page1.html:

{% extends "base1.html" %}

{% block foo %}
   {% include "commondata.html" %}
{% endblock %}

page2.html:

{% extends "base2.html" %}

{% block bar %}
   {% include "commondata.html" %}
{% endblock %}

Ulteriori informazioni sul motivo per cui non ha funzionato per me nel caso in cui aiuti le persone future:

Il motivo per cui non funzionava è che a {% include%} in django non piacciono i caratteri speciali come l'apostrofo di fantasia. I dati del modello che stavo cercando di includere sono stati incollati da Word. Ho dovuto rimuovere manualmente tutti questi caratteri speciali e poi li ha inclusi correttamente.

Non è possibile estrarre blocchi da un file incluso in un modello figlio per sovrascrivere i blocchi del modello principale. Tuttavia, puoi specificare un genitore in una variabile e far specificare il modello di base nel contesto.

Dalla documentazione :

  

{% estende la variabile%} utilizza il valore della variabile. Se la variabile restituisce una stringa, Django userà quella stringa come nome del modello genitore. Se la variabile restituisce un oggetto Template, Django userà quell'oggetto come template genitore.

Invece di separare " page1.html " e " page2.html " ;, inserisci {% estende base_template%} nella parte superiore di " commondata.html " ;. Quindi, a tuo avviso, definisci base_template in modo che sia " base1.html " o " base2.html " ;.

Aggiunto per riferimento a persone future che lo trovano tramite google: potresti voler esaminare il tag {% overextend%} fornito dalla libreria mezzanine per casi come questo.

Modifica il 10 dicembre 2015 : come sottolineato nei commenti, ssi è obsoleto dalla versione 1.8. Secondo la documentazione:

  

Questo tag è stato deprecato e verrà rimosso in Django 1.10. Utilizza invece il tag include.


Secondo me, la risposta (migliore) giusta a questa domanda è quella di podshumok , in quanto spiega perché il comportamento di include quando usato insieme all'eredità.

Tuttavia, sono rimasto un po 'sorpreso dal fatto che nessuno abbia menzionato il tag ssi fornito dal sistema di template Django, che è specificamente progettato per inline incluso un pezzo esterno di text . Qui, inline significa che il testo esterno non sarà interpretato, analizzato o interpolato, ma semplicemente "copiato". all'interno del modello chiamante.

Per ulteriori informazioni, consultare la documentazione (assicurarsi di verificare la versione appropriata di Django nel selettore nella parte in basso a destra della pagina).

https://docs.djangoproject.com/en/ dev / ref / templates / builtins / # ssi

Dalla documentazione:

ssi
Outputs the contents of a given file into the page.
Like a simple include tag, {% ssi %} includes the contents of another file
– which must be specified using an absolute path – in the current page

Fai attenzione anche alle implicazioni sulla sicurezza di questa tecnica e anche alla definizione ALLOWED_INCLUDE_ROOTS richiesta, che deve essere aggiunta ai tuoi file delle impostazioni.

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