2013-06-03 14 views
8

Mi piacerebbe avere qualche consiglio nella costruzione di livelli di template django.Ereditarietà modello Django: quanti livelli e quale pagina rendere

Leggendo i documenti, non capisco come creare una struttura gerarchica di modelli con più di 2 livelli.

Per esempio, vorrei creare 3 livelli di ereditarietà:

base.html 
    └── base_level2.html 
      ├── level2_level3_1.html 
      └── level2_level3_2.html 

Questo è il mio codice:

  • base.html

    First level 
    {% block level2 %}{% endblock %} 
    
  • base_level2.html

    {% extends "base.html" %} 
    {% block level2 %} 
        Second level 
        {% block level3_1 %}{% endblock %} 
        {% block level3_2 %}{% endblock %} 
    {% endblock %} 
    
  • level2_level3_1.html

    {% extends "base_level2.html" %} 
    {% block level3_1 %} 
        Third level, part 1 
    {% endblock %} 
    
  • level2_level3_2.html

    {% extends "base_level2.html" %} 
    {% block level3_2 %} 
        Third level, part 2 
    {% endblock %} 
    
  • views.py:

    def myView(request): 
        return render_to_response('level2_level3_1.html', {}, context_instance=RequestContext(request)) 
    

In questo modo posso vedere quanto segue su il mio browser:

First level 
Second level 
Third level, part 1 

E questo è logico perché ho chiamo render_to response solo su level2_level3_1.html.

Ovviamente, se chiama level2_level3_2.html, ricevo il messaggio Third level, part 2 ma non lo Third level, part1.

Come risolvere questo? E 'un buon approccio? Ho strutturato roba in questo modo perché i miei modelli reali sono molto grandi, molte linee di codice, quindi vorrei mantenere un po 'di ordine. Qualsiasi consiglio sarà apprezzato.

+0

qual è il problema? vuoi avere 'Terzo livello, parte 1' e' Terzo livello, parte 2'. perché non puoi inserire entrambe le parti nella stessa pagina? appartengono a due blocchi diversi. – EsseTi

+0

Come ho detto sopra "Ho strutturato roba in questo modo perché i miei modelli reali sono molto grandi ...". Questo è un esempio minimo ma il mio livello2_level3_1.html e level2_level3_2.html sono in realtà molto lunghi e non voglio unirli in un enorme singolo file. – caneta

risposta

6

È difficile dire se è una buona o una cattiva idea o no senza conoscere la funzionalità specifica dei modelli, ma la mia reazione immediata è che si sta cercando di organizzare oltre i modelli. Penso che la maggior parte delle persone ti spingerebbe lontano da un sistema a più livelli perché rende più difficile apportare piccole modifiche nel sito web e più difficile tenere traccia di dove sono le cose. dalla Zen di Python:

piatto è meglio di annidata

La raccomandazione per un sistema a 3 livelli in Two Scoops of Django va in questo modo:

  1. Ogni applicazione ha un base_<app_name>.html modello. I modelli di base a livello di app condividono un genitore comune, base.html.
  2. I modelli all'interno di app condividono un modello genitore base_ <app_name> .html.
  3. qualsiasi modello allo stesso livello base.html eredita base.html

e per il vostro schema di denominazione, potrebbe assomigliare a questo:

| Templates/ 
    |--base.html 
    |--someothertemplate.html # extends base.html 
    |--level2/ 
    |----base_level2.html  # extends base.html 
    |----level2_1.html  # extends base_level2.html 
    |----level2_2.html  # extends base_level3.html 

EDIT: e non c'è alcuna reale motivo:

Second level 
    {% block level3_1 %}{% endblock %} 
    {% block level3_2 %}{% endblock %} 

dove ciascun blocco fa riferimento al contenuto di un modello. è possibile semplificare che a un isolato come

{% block level3 %}{% endblock level3%} 

e poi in ognuno dei modelli level3, rinominare i blocchi di conseguenza

+0

Ok, quindi nessun modo di split level3, anche se è lungo migliaia di righe? – caneta

+0

Puoi spiegare cosa intendi per "livello intermedio"? Questi livelli appaiono sulla stessa pagina? e stai solo cercando di tagliare la pagina in modo che sia più facile da gestire? Se il tuo modello è lungo migliaia di righe, probabilmente stai facendo qualcosa di sbagliato. Dovresti scrivere un codice che generi html per te. – skzryzg

+0

Non è "split level", ma come dividere ................ level3. Sì, questi livelli vengono visualizzati nella stessa pagina, come illustrato nell'esempio. Sì, vorrei tagliare la mia pagina in modo che sia più facile da gestire. Il mio modello è lungo migliaia di righe perché è molto grande e complicato, non perché non utilizzo le strutture Django, i tag modello e così via ... – caneta

3
non

Probabilmente il miglior modo di farlo, ma si potrebbe utente includehttps://docs.djangoproject.com/en/dev/ref/templates/builtins/#include

qualcosa di simile per base_level2.html

{% extends "base.html" %} 
{% block level2 %} 
Second level 
{% include "level2_level3_1.html" %} 
{% include "level2_level3_2.html" %} 
{% endblock %} 

non ho testato questo, quindi non so che funziona.

e btw:

Il includono tag deve essere considerato come un'implementazione di “rendere questo subtemplate e comprendono il codice HTML”, non come “analizzare questo subtemplate e comprendere il suo contenuto come se fosse parte della genitore". Ciò significa che non esiste uno stato condiviso tra i modelli inclusi: ogni inclusione è un processo di rendering completamente indipendente.

+0

Sì, è per quella clausola che non ho usato il tag include. – caneta

+0

ma dovrebbe fare quello che ti serve, puoi anche passare i parametri. – EsseTi

+0

Ok, ci provo, grazie! – caneta

Problemi correlati