Sembra come se il tuo layout fosse solido. Hai un modello base.html
che definisce la struttura di base e il layout esterno per ogni pagina nella tua app. Hai anche base_object.html
che estende questo modello.
Desiderate che ogni pagina abbia un titolo univoco e una corrispondenza h1 (credo). Il modo migliore per farlo è definire due blocchi separati nel modello base.html.
<html>
<head>
<title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
<h1>{% block h1 %}{% endblock %}</h1>
</body>
</html>
Nei modelli figlio, è necessario sostituirli entrambi se si desidera che siano identici. So che ritieni che ciò sia contro-intuitivo, ma è necessario a causa del modo in cui l'ereditarietà del template viene gestita in Django.
Fonte: The Django template language
Infine, ricordiamo che non è possibile definire più {% block %}
tag con lo stesso nome nello stesso modello. Questa limitazione esiste perché un tag di blocco funziona in entrambe le direzioni. Cioè, un tag di blocco non fornisce solo un buco da riempire, ma definisce anche il contenuto che riempie il buco nel genitore. Se ci fossero due tag {% block %}
con nome simile in un modello, il genitore di quel modello non avrebbe saputo quale dei contenuti dei blocchi usare.
I bambini guardano in questo modo:
{% extends "base.html" %}
{% block title %}Title{% endblock %}
{% block h1 %}Title{% endblock %}
Se questo ti dà fastidio, si dovrebbe impostare il titolo dal punto di vista di ogni oggetto come una variabile del template.
{% block title %}{{ title }}{% endblock %}
{% block h1 %}{{ title }}{% endblock %}
Django si sforza di mantenere il più possibile la logica del livello di modello. Spesso un titolo è determinato dinamicamente dal database, quindi il livello di visualizzazione è il luogo perfetto per recuperare e impostare queste informazioni. Si può ancora lasciare il titolo in bianco se si desidera rinviare al titolo di default (forse impostato in base.html
, oppure si può prendere il nome del sito dal pacchetto django.contrib.sites
)
anche {{ block.super }}
può rivelarsi utile. Ciò ti consentirà di combinare il contenuto del blocco principale con contenuti aggiuntivi del bambino. Così si potrebbe definire un titolo come "Stackoverflow.com" nella base, e impostare
{% block title %}{{ block.super }} - Ask a Question{% endblock %}
nel bambino per ottenere un titolo come "Stackoverflow.com - Fai una domanda"
Questo non è il modo in cui Django dovrebbe essere usato. –
@Frank Crook: cura di spiegare? –
@csunwold: Non ho davvero tempo, o avrei semplicemente risposto alla domanda. Per essere brevi, la domanda viene da qualcuno che ha un malinteso fondamentale su come i blocchi e l'ereditarietà funzionano nel sistema di template di Django. La tua risposta non chiarisce questo per loro, invece salta completamente sull'argomento dei blocchi e dell'ereditarietà e mostra un esempio in cui non vengono utilizzati affatto. –