Django-alkalmazások építő elemei

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:

Django introduction

python, django, webfejlesztés,