2009-03-22 11 views
12

Pracuję w witrynie Django, która ma wiele sekcji i podsekcji. Chciałbym mieć kilka głębokości dziedziczenia szablonów: szablon podstawowy dla całej witryny, jeden szablon podstawowy dla każdej sekcji dziedziczącej z szablonu podstawowego katalogu głównego i tak dalej. Oto uproszczona wersja mojego pożądanej struktury katalogów:Django: określenie szablonu bazowego według katalogu

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

Co bym pragnienie jest dla wszystkich plików w section1/ się zawierać coś {% extends "base.html" %}, co oznacza, że ​​rozciągają się one section1/base.html. section1/base.html zawierałoby coś w rodzaju {% extends "../base.html" %}, co oznacza, że ​​rozszerzyłoby podstawowy plik poziomu. Jednak w dokumentacji nie znalazłem niczego, co sugerowałoby, że jest to możliwe, i nie mogłem przekonać Django do rozróżnienia między "../base.html" i "base.html". ({% extends "../base.html" %} Zgłasza błąd.) Przypuszczam, że jednym z rozwiązań byłoby zmiana nazwy wszystkich plików bazowych base_SECTIONNAME.html i aktualizacja wszystkich plików, które dziedziczą po nich, ale obawiam się, że może to być trudne do utrzymania, ponieważ moja strona staje się większa i nazwy zmian sekcji itp. Wolałbym rozwiązanie, które korzysta z naturalnej hierarchii określonej przez katalogi i podkatalogi.

Wszelkie pomysły?

Odpowiedz

18

Może to być coś, co można nadzorować, ale wszystko, czego pragniesz, można osiągnąć dzięki systemowi szablonów django. Wszystkie przedłużenia wywołań odnoszą się do katalogów szablonów.

  1. aby wszystkie pliki w podkatalogach base.html przedłużenia base.html, wystarczy umieścić {% extends "base.html" %} do plików. section1/base.html wyglądałoby tak.

    {% extends "base.html" %}

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

  2. Teraz, aby pobrać pliki z sekcja1 przedłużyć sekcja1/base.html wystarczy umieścić {% extends "section1/base.html" %} na górze nich. To samo dotyczy sekcji 2, sekcji 3 i tak dalej.

Jest to po prostu takie proste, ale może nie być całkowicie oczywiste w dokumentacji.

Mam nadzieję, że zrozumiałem twoje pytanie.

+2

Prawe ... ścieżki względne nie będą działać z przedłużeniami. –

+1

Nie mogą, ponieważ możesz mieć szablony w różnych miejscach. –

+3

Warto wspomnieć, że wszystkie foldery (/ root,/root/section1,/root/section2, ...) muszą być ustawione jako django TEMPLATE_DIRS w przeciwnym razie nie będzie działać. –

5

Przyjmowana odpowiedź zadziała, ale zalecam stosowanie nazw zmiennych do śledzenia struktury przekroju. Moje osobiste preferencje to context processor. Jeśli, na przykład, organizacja sekcji witryny jest przejrzysty wyraz w adresie URL, spróbuj coś takiego:

# 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'} 

Następnie w szablonie, wystarczy zadzwonić

{% extends local_base %} 

Istnieje prawdopodobnie kilkanaście innych sposobów na to, ale najważniejsze jest, aby pomyśleć o uniknięciu zakodowania nazwy folderu w szablonie. To da ci dużo kilometrów, zwłaszcza, że ​​możesz przeciągać i upuszczać szablon pomiędzy sekcjami, jeśli są dostatecznie podobne.Inną rzeczą, można dodać wkładki wynosi:

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} 

Dobrą zaletą tej strategii jest oczywiście, że można uzyskać rozdział up fly-weight i działa bez żadnego lokalnego szablonu bazowego w ogóle.

+0

Nice post. Nie jestem pewien, jeśli stracę więcej, zyskuję dzięki temu rozwiązaniu. Muszę to ocenić. –

+0

Oczywiście ma to miejsce w każdym przypadku. Po prostu podpowiedź, jakie dodatkowe warstwy organizacji mogą wejść w grę. –

0

Możesz użyć tej biblioteki: https://github.com/vb64/django.templates.relative.path

Wystarczy napisać w szablonach następująco:

{% RELATIVE_PATH obciążenie%} {% rozciąga ".base.html" %}

to rozszerzy szablon "base.html", znajdujący się w tym samym folderze, w którym szablon umieścił% {% load relative_path%} {% extends "... base.html"%}

Rozszerz szablon "base.html", znajdujący się na dwóch poziomach wyżej

samo działa ze znacznikiem "załóż".

Powiązane problemy