Hello, world v4
V tejto chvíli to vyzerá tak, že každá view má obvykle svoj súbor so šablónou. Naozaj to tak aj je.
Doterajší prístup však vedie k nemilému javu. HTML stránky v rámci jednej site obvykle obsahuju kopu spoločného kódu. To by viedlo k duplicite kódu v súboroch so šablónami, čo je zjavne zle; pri zmene spoločného kódu to musíme meniť na viacerých miestach naraz.
Nástroj na riešenie tohto problému je tag {% extends "..." %} .
Ideme upraviť verziu 3. Chceme ju rozšíriť o pozdrav goodbye.
Obsah adresára templates je takýto (nie txt ale html)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <style type="text/css"> h1 { color:red; font-style:normal; } </style> <head> <title> Hello, world v4 </title> </head> <body> <h1> {% block pozdrav %} Toto tu neuvidime, lebo sa to pretazi. {% endblock %} </h1> </body> </html>common.txt
{% extends "common.html" %} {% block pozdrav %} Hello, {{ who }}. {% endblock %}hello.txt
{% extends "common.html" %} {% block pozdrav %} Goodbye, {{ who }}. {% endblock %}goodbye.txt
Logika veci je zrejmá. Naše views budú používať v skutočnosti šablóny hello.html a goodbye.html. Spoločná časť je vytiahnutá v common.html, ktorú ostatné dve subšablóny dedia cez {% extends "common.html"%} . common.html má v sebe vyznačený block menom pozdrav, ktorý jej podšablóny preťažujú.
Takto je možné (a žiadúce) vytvoriť celú hierarchiu šablón.
1
2 from django.http import HttpResponse
3 from django.template import Context,loader
4
5 def hello(request,who):
6 t=loader.get_template('hello.html')
7 c=Context({'who':who})
8 html=t.render(c)
9 return(HttpResponse(html))
10
11 def goodbye(request,who):
12 t=loader.get_template('goodbye.html')
13 c=Context({'who':who})
14 html=t.render(c)
15 return(HttpResponse(html))
Ešte zostáva pridať ďalšiu položku do urlpatterns:
1 (r'^goodbye/(.*)/$', views.goodbye),
Vyskúšajme:
Celý projekt: hello_v4.tar.gz
Pre poriadok ešte uvediem, že podobné veci je možné dosiahnuť pomocou tagu {% include "..." %} .