2009-07-24 11 views
15
<html> 
    <head> 
     <title>{% block title %}{% endblock %}</title> 
    </head> 

    <body> 
     <h1>{% block title %}{% endblock %}</h1> 
    </body> 
</html> 

Questo è il mio modello, più o meno. L'intestazione h1 è sempre la stessa del tag title. Lo snippet di codice sopra riportato non è valido perché non possono esistere due blocchi con lo stesso nome. Come gestisco questo senza ripetermi?Qual è il modo migliore per duplicare i dati in un modello django?


modifica per chiarire: ho un sacco di template figli ereditati da questo modello, e così facendo una nuova variabile {{title}} per ogni modello non è una soluzione molto buona. In precedenza avevo impostato in questo modo:

base.html:

<title>{% block title %}{% endblock %}</title> 

poi nel base_view.html (estensione base.html):

<h1>{% block title %}{% endblock %}</h1> 

poi nel base_object.html (che si estende base_view.html):

{% block title %}my title goes here{% endblock %} 

e ha funzionato in qualche modo. Ho rifattorizzato i miei modelli così c'è solo base.html e base_object.html Come posso recuperare questa funzionalità?

risposta

8

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"

1

Passa una variabile al tuo modello, forse chiamata titolo. Quindi sostituisci il tuo cartiglio con {{title}}. Per superare questo nel tuo modello nella vista assicurarsi di avere:

def myview(request): 
    t = loader.get_template("mypage.html") 
    title = "My Title" 
    c = Context({"title" : title }) 
    HttpResponse(t.render(c)) 

Poi nel modello si avrà:

<html> 
<head> 
    <title>{{ title }}</title> 
</head> 

<body> 
    <h1>{{ title }}}</h1> 
</body> 

Vedi anche: How to repeat a "block" in a django template

+0

Questo non è il modo in cui Django dovrebbe essere usato. –

+0

@Frank Crook: cura di spiegare? –

+0

@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. –

8
{% extends "base.html" %} 

{% with "Entry Title" as title %} 
    {% block title %}{{ title }}{% endblock %} 
    {% block h1 %}{{ title }}{% endblock %} 
{% endwith %} 

Quello potrebbe funzionare se sei in realtà preoccupato di mantenere title fuori dai punti di vista e non ripetersi.

20

In base.html:

<head> 
    <title>{% block title %}{% endblock %}</title> 
</head> 

<body> 
    <h1>{% block h1 %}{% endblock %}</h1> 
</body> 

Poi, fare un altro strato "base" in cima a quello chiamato content_base.html (o qualcosa del genere):

{% extends "base.html" %} 

{% block h1 %}{% block title %}{% endblock %}{% endblock %} 

Ora hanno tutti gli altri modelli estendi content_base.html. Qualunque cosa tu metta nel blocco "titolo" in tutti i tuoi modelli andrà nei blocchi "titolo" e "h1" in base.html.

+0

Ahi, ma suppongo che funzionerà. – mlissner

Problemi correlati