Django-alkalmazások építő elemei
Posted by Lázár István
Az alábbi bejegyzés képet ad arról, hogy mely elemek képezik a Django-alkalmazások fő részeit.
A kérelem és a nézet összekapcsolása (urls.py)
Az URL-mapper egy urls.py nevű fájlban található. Az alábbi példában a mapper meghatározza az útvonalak (a beérkező kérésben található URL - minták) és az azokhoz kapcsolandó nézet funkciók listáját. Ha olyan HTTP-kérés érkezik, amelynek URL-je megegyezik egy megadott mintával, akkor a kapcsolódó nézeti függvény meghívódik, és átadja a kérést.
urlpatterns = [
path('admin/', admin.site.urls),
path('book//', views.book_detail, name='book_detail'),
path('catalog/', include('catalog.urls')),
re_path(r'^([0-9]+)/$', views.best),
]
Az urlpatterns objektum egy lista a path() és / vagy a re_path() függvények számára. Mindkét módszer első argumentuma egy útvonal (minta), melyhez második argumentumként egy újabb függvény kapcsolódik, amely a minta egyezésekor kerül meghívásra. A harmadik paraméter opcionális. Egy névvel láthajuk az adott folyamatot, melynek segítségével később magunk is meghívhatjuk azt, pl. egy belső híváshoz egy url-ként. Például a http://127.0.0.1/book/5/ kérés esetén a views.py fájlban rögzített book_detail() függvény kerül meghívásra.
A kérelem kezelése (views.py)
A nézetek képezik a webalkalmazás szívét, fogadják a webes kliensek HTTP-kéréseit és visszaküldik a HTTP-válaszokat (más keretrendszerekben az ilyen funkciókat ellátó eszközöket általában controller-eknek nevezik). Közben összefoglalják a keretrendszer többi erőforrását az adatbázisok eléréséhez, a sablonok megjelenítéséhez stb.
Az alábbi példa egy minimális nézet függvényt mutat be index(). Mint minden nézetfüggvény, ez is egy HttpRequest objektumot kap paraméterként (request). Ebben a konkrét példában nem teszünk semmit a kéréssel, csak egy karakterláncot adunk vissza, egy HttpResponse objektum paramétereként.
# filename: views.py (Django view functions)
from django.http import HttpResponse
def index(request):
# Get an HttpRequest - the request parameter
# perform operations using information from the request.
# Return HttpResponse
return HttpResponse('Hello from Django!')
A következő kódrészlet egy másik lehetséges nézet funkciót valósít meg, mely az összes U09-es szintű csapatunk megjelenítését teszi lehetővé. A list_teams = Team.objects.filter(team_level__exact="U09") sor megmutatja, hogyan használhatjuk a model lekérdezés API-t az összes olyan rekord szűrésére, ahol a team_level mező pontosan a "U09" szöveget tartalmazza. Megfigyelhető, hogy ez a feltétel hogyan kerül átadásra a filter()függvénynek argumentumként, a mező neve és az egyezés típusa dupla aláhúzással: team_level__exact).
## filename: views.py
from django.shortcuts import render
from .models import Team
def index(request):
list_teams = Team.objects.filter(team_level__exact="U09")
context = {'youngest_teams': list_teams}
return render(request, '/best/index.html', context)
Ez a változat a render() függvényt használja a böngészőnek történő válasz küldésére. HTML-fájlt hoz generál egy megadott HTML-sablon és néhány adat kombinálásával, amelyeket a sablonba fog beilleszteni. A lekérdezet és atadandó adatokat a "context" nevű változó továbbítja a sablon felé.
Adatmodellek meghatározása (models.py)
A Django webes alkalmazások Python-objektumokon keresztül kezelik az adatokat, amelyeket modelleknek nevezünk. A modellek határozzák meg a tárolt adatok szerkezetét, beleértve a mezőtípusokat és esetleg azok maximális méretét, az alapértelmezett értékeket, a kiválasztási lista opcióit, a dokumentáció súgóját, az űrlapok címkeszövegét stb. A modell definíciója független az alapul szolgáló adatbázistól, a projektbeállítások részeként több típus közül lehet választani. A használni kívánt adatbázissal egyáltalán nem kell közvetlenül "beszélnie", csak megírja a modell szerkezetét és egyéb kódját, és a Django elvégzi az adatbázissal való kommunikáció minden "piszkos munkáját". :)
Az alábbi kódrészlet egy nagyon egyszerű Django modellt mutat be, amely egy Team objektumot reprezentál. A Team osztály a django osztályból származik (models.Model). Karaktermezőként határozza meg a csapat nevét és a csoport szintjét, és meghatározza az egyes rekordokhoz tárolható karakterek maximális számát. A team_level több érték egyike lehet, ezért választási mezőként definiáljuk, és leképezést biztosítunk a megjelenítendő választási lehetőségek és a tárolandó adatok között, valamint egy alapértelmezett értéket.
# filename: models.py
from django.db import models
class Team(models.Model):
team_name = models.CharField(max_length=40)
TEAM_LEVELS = (
('U09', 'Under 09s'),
('U10', 'Under 10s'),
('U11', 'Under 11s'),
... #list other team levels
)
team_level = models.CharField(max_length=3, choices=TEAM_LEVELS, default='U11')
Adatok megjelenítése (HTML-sablonok)
A sablonrendszerek lehetővé teszik a kimeneti dokumentum szerkezetének megadását, helyőrzőket használva az oldal létrehozásakor kitöltendő adatokhoz. A sablonokat gyakran használják HTML létrehozására, de más típusú dokumentumokat is készíthetnek.
Ezt a sablont azzal a feltételezéssel írtuk meg, hogy hozzá fog férni egy lista változóhoz (youngest_teams), amelyet annak előállításakor hívunk meg (ezt a context változó tartalmazza). A HTML-vázon belül van egy kifejezés, amely először ellenőrzi, hogy youngest_teams változó létezik-e, majd egy for ciklusban iterálja azt. A sablon minden iterációnál megjeleníti az egyes csapatok team_name értékét egy-egy elemben.
<body>
{% if youngest_teams %}
<ul>
{% for team in youngest_teams %}
<li>{{ team.team_name }}</li>
{% endfor %}
</ul>
{% else %}
<p>No teams are available.</p>
{% endif %}
</body>
Az összefoglaló elkészítéséhez az alábbi oldalakon található információkat használtam fel: