2009-03-22 15 views
12

Sto lavorando a un sito Django che ha più sezioni e sottosezioni. Mi piacerebbe avere diverse profondità di ereditarietà del modello: un modello di base per l'intero sito, un modello di base per ogni sezione che eredita dal modello di base radice e così via. Ecco una versione semplificata della mia struttura di directory desiderata:Django: specifica un modello base per directory

base.html 
section1/ 
    base.html 
section2/ 
    base.html 
section3/ 
    base.html 

Che cosa voglio è per tutti i file sotto section1/ per contenere qualcosa come {% extends "base.html" %}, nel senso che estenderebbero section1/base.html. section1/base.html conterrebbe qualcosa come {% extends "../base.html" %}, il che significa che estenderebbe il file di base a livello di radice. Tuttavia, non ho trovato nulla nella documentazione che suggerisca che fosse possibile, e non ho potuto fare in modo che Django distinguesse tra "../base.html" e "base.html". ({% extends "../base.html" %} genera un errore). Suppongo che una soluzione alternativa sarebbe rinominare tutti i file di base base_SECTIONNAME.html e aggiornare tutti i file che li ereditano, ma sono preoccupato che questo possa diventare difficile da mantenere man mano che il mio sito diventa più grande e le sezioni cambiano nome , ecc. Preferirei una soluzione che sfrutta la gerarchia naturale specificata da directory e sottodirectory.

Qualche idea?

risposta

18

Posso essere supervisore di qualcosa, ma tutto ciò che desideri può essere realizzato con il sistema di modelli django. Tutte le chiamate estese sono relative alle directory dei modelli.

  1. Affinché tutti i file base.html nelle sottodirectory di estendere base.html, devi solo mettere un {% extends "base.html" %} nei file. section1/base.html sarebbe simile a quello.

    {% extends "base.html" %}

    {# ... rest of your code ...#}

  2. Ora, per ottenere i file da section1 di estendere section1/base.html devi solo mettere {% extends "section1/base.html" %} in alto di loro. Lo stesso per section2, section3 e così via.

È proprio così semplice, ma potrebbe non essere del tutto ovvio nella documentazione.

Spero, ho capito la tua domanda.

+2

Giusto ... i percorsi relativi non funzioneranno con le estensioni. –

+1

E non possono, perché è possibile avere modelli in varie posizioni. –

+3

Vale la pena ricordare che tutte le cartelle (/ root,/root/section1,/root/section2, ...) devono essere impostate come django TEMPLATE_DIRS altrimenti non funziona. –

5

La risposta accettata funzionerà, ma mi raccomando di utilizzare nomi di variabili per tenere traccia della struttura della sezione. La mia preferenza personale sarebbe uno context processor. Se, ad esempio, l'organizzazione sezione del tuo sito è trasparente riflette nella URL, provare qualcosa di simile:

# It may be convenient to make this function live in or near your url conf. 
def convert_url_path_to_folder_path(path): 
    # fill in the magic here 

def sub_folder_available(request): 
    folder = convert_url_path_to_folder_path(request.path) 
    return {'subsection': folder, 'local_base':folder+'/base.html'} 

Poi nel modello, basta chiamare

{% extends local_base %} 

Probabilmente ci sono una dozzina di altri modi per farlo questo, ma la cosa principale è pensare di evitare l'hard-coding del nome della cartella nel modello. Questo ti porterà un sacco di chilometri, soprattutto perché puoi semplicemente trascinare e rilasciare il modello tra le sezioni se sono abbastanza simili.Un'altra cosa che si potrebbe aggiungere inserto è:

def sub_folder_available(request): 
    folder = convert_url_path_to_folder_path(request.path) 
    # Check if local base exists: 
    if os.access(folder+'/base.html',os.F_OK): 
     base = folder+'/base.html' 
    else: 
     # revert to your global base 
     base = 'base.html' 
    return {'subsection': folder, 'base':base} 

Il bel vantaggio di questa strategia è, naturalmente, che si può ottenere una sezione fly-peso installato e funzionante senza alcun modello di base locale a tutti.

+0

Bel post. Non sono sicuro, se perdo ancora di più, guadagno con questa soluzione. Devo valutare questo. –

+0

Ovviamente è caso per caso. Solo suggerendo quali ulteriori livelli di organizzazione possono entrare in gioco. –

0

È possibile utilizzare questa libreria: https://github.com/vb64/django.templates.relative.path

Basta scrivere nel tuo template come segue:

{% del carico RELATIVE_PATH%} {% estende ".base.html" %}

questo si estenderà template "base.html", che si trova nella stessa cartella, in cui il modello collocato

{% del carico RELATIVE_PATH%} {% estende "... base.html" %}

0.123.

estendere il modello "base.html", situato a due livelli più alti

stesso funzionamento con tag "include".

Problemi correlati