
Python: Django III / 22. časť
Posledné dve časti seriálu sme venovali teórii a informáciám, ktoré sa týkali tých najpodstatnejších detailov tvorby webových aplikácií s využitím frameworku Django. V tejto časti sa vrhneme na praktickú prípravu aplikácie, a to riadne zostra.
Projekt
Už vieme, že nový projekt Django vytvoríme pomocou príkazu django-admin startproject. V aktuálnej pracovnej zložke dôjde k vytvoreniu štruktúry, ktorá bude obsahovať všetky zložky a súbory patriace novému projektu. Naše súbory teda nevkladáme do klasickej zložky root webového servera (najčastejšie /var/www), ale pracujeme v úplne odlišnom pracovnom priestore. Ten je určený na vývoj (development) a server, ktorý spustíme príkazom python3 manage.py runserver, je takisto určený prioritne na vývoj. Dev-server sa správa tak, že pri akejkoľvek zmene zdrojového kódu, automaticky obnovuje (reloads) svoj výstup, pričom reštart servera je potrebný iba v niektorých prípadoch (napr. pridanie nového súboru).
Aplikácia
Novú aplikáciu vytvoríme pomocou príkazu python3 manage.py startapp, ktorý spustíme v rovnakej pracovnej zložke projektu. Následne vykonáme zmeny týkajúce sa použitia databázového prostredia MySQL, ktoré sme opísali v 20. časti seriálu. Novú aplikáciu pridáme do projektu pomocou príslušnej referencie v rámci INSTALLED_APS, ktorá sa nachádza v súbore projekt_energie/settings.py. Odkážeme pritom na triedu EnergieConfig (nachádza sa v súbore energie/apps.py).
View
Do súboru energie/views.py doplníme dve funkcie: voda_index() a voda_detail(). Prvá z nich je určená na zobrazenie (rendering) šablóny voda/index.html a druhá na zobrazenie šablóny voda/detail.html. Obe funkcie pritom pracujú s údajmi, ktoré definuje model Voda (jeho definícia sa nachádza v súbore energie/models.py). Model = jednoduchá databázová tabuľka, ktorá obsahuje 4 stĺpce:
1. |
datum |
aktuálny dátum |
2. |
spotreba |
spotreba odčítaná z merača v danom dni (dátume) |
3. |
rozdiel spotreby |
rozdiel spotreby odčítanej v daný deň a predošlej odčítanej spotreby |
4. |
denna spotreba |
spotreba prepočítaná na deň = rozdiel spotreby / počet dní od predošlého odčítania spotreby |
Príklad programového kódu je nasledujúci:
def voda_index(request):
rows = Voda.objects.all()
template = loader.get_template('voda/index.html')
context = {
'voda' : rows
}
return HttpResponse(template.render(context,request))
Uvedený kód možno skrátene napísať takto:
def voda_index(request):
rows = Voda.objects.all()
context = {
'voda' : rows
}
return render(request,'voda/index.html',context)
Funkcia voda_index() nahráva šablónu voda/index.html, ktorej odovzdáva pripravený context. Context je slovník, ktorý mapuje názvy premenných šablóny (template variable names) na objekty Pythonu. Funkcia render() skracuje pôvodný zápis. Jej argumentmi sú request objekt, názov šablóny a slovník context. Funkcia vracia pôvodne používaný objekt HttpResponse.
Urls
V pracovnej zložke novo vytvorenej aplikácie sa nenachádza súbor urls.py, a preto ho musíme vytvoriť. Následne doplníme odkaz na tento nový súbor do súboru urls.py nášho projektu. To značí, že otvoríme súbor projekt_energie/urls.py a doplníme doň riadok path('energie/',include('energie.urls')). Súbor zavrieme a ďalej pokračujeme v editácii súboru energie/urls.py, do ktorého časti urlpatterns doplníme nasledujúce riadky:
path("voda",views.voda_index,name = "voda/index")
path("
Admin
Ako už vieme, Django automaticky vytvára správcovské rozhranie, ktoré používame na správu našich databázových tabuliek. Na to, aby sme toto rozhranie pridali do našej aplikácie, spustíme jednoduchý príkaz python3 manage.py createsuperuser. Potom pridáme do súboru energie/admin.py nasledujúce riadky:
from .models import Voda
admin.site.register(Voda)
Obr. 1 Django site admin
Templates
Django využíva na oddelenie dizajnu webových stránok od ich obsahu tzv. systém šablón (template system). Práca so šablónami sa začína vytvorením zložky templates v rámci zložky energie. V zložke templates ďalej vytvoríme novú zložku voda a v nej vytvoríme dva nové súbory s názvami index.html a detail.html. Ide o presne tie isté súbory, na ktoré odkazujeme v súbore energie/views.py. Definícia úplnej cesty vrátane zložky voda je príznačná pre systém šablón frameworku Django. Ten využíva tzv. Template Namespacing, ktorého princíp spočíva v umiestňovaní šablón patriacich jednotlivým aplikáciám do samostatných podzložiek zložky templates.
Pri vzájomnom volaní jednej šablóny z druhej sa snažíme nepoužívať priamo vložené URL adresy, ale namiesto toho používame značku {% url „názov“ %}. Názov je totožný s argumentom name funkcií path(), ktoré definujeme v súbore energie/urls.py. Ak potom potrebujeme zmeniť miesto uloženia konkrétnej šablóny, upravíme príslušný riadok path() a nemusíme upravovať všetky odkazy vo všetkých dotknutých šablónach. Navyše musíme dodať, že Django okrem Template Namespacingu využíva aj tzv. URL Namespacing. Predstavme si, že máme jeden projekt, v ktorom existuje viacero aplikácií. Jednotlivé funkcie path() patriace príslušnej aplikácii môžu obsahovať rovnaké argumenty name, ktoré však patria rozličným aplikáciám. Ich odlíšenie môžeme riešiť dvoma spôsobmi:
1. Namiesto výrazu name = „detail“ použijeme výraz name = „voda/detail“
2. Aplikujeme URL Namespacing:
a) pred blok urlpatterns vložíme riadok:
app_name = voda
b) pri odkazovaní na šablóny patriace aplikácii voda použijeme značky:
{% url „voda:detail“ %}
Obr. 2 Grafický výstup projektu Spotreba energií
CSS
Je všeobecne známe, že na úpravu vzhľadu stránok HTML používame tzv. štýly CSS. Django hľadá štýly CSS rovnako ako obrázky alebo skripty v špeciálnej zložke s názvom static. Tú vytvoríme v zložke energie. Následne rovnako ako v prípade templates v tejto zložke vytvoríme podzložku s názvom voda. Platí tu rovnaký princíp ako v prípade šablón, ale tentoraz hovoríme o tzv. Static-file Namespacingu. Django na základe neho rozlišuje, ktorý konkrétny štýl CSS má nahrať v prípade príslušnej aplikácie. Do vytvorenej zložky energie/static/voda umiestnime naše štýly CSS, na ktoré odkážeme v šablóne base.html pomocou výrazov:
{% load static %}
Zobrazit Galériu