django-admin startproject IME_PROJEKTA IME_MAPE
manage.py: glavni program za delo s projektomIME_PROJEKTA/: mapa z glavnim modulom projekta
__init__.py: prazna datoteka, ki določa modulsettings.py: datoteka z nastavitvamiurls.py: specifikacije potiasgi.py, wsgi.py: vstopni točki za različne spletne strežnikemanage.pymanage.py lahko kličemo kot
python manage.py UKAZ ...
runserver: požene razvojni spletni strežnikmakemigrations: ustvari migracije glede na spremembe modelamigrate: požene migracije, da spravi bazo v stanje, konsistentno z modelomcreatesuperuser: ustvari račun za skrbnikashell: požene ukazno vrstico z naloženim projektompython manage.py startapp APLIKACIJA
APLIKACIJA z vsebino:
__init__.py: prazna datoteka, ki določa moduladmin.py: skrbniški vmesnikmodels.py: podatkovni modeltests.py: testiviews.py: pogledi (logika aplikacije)migrations/: mapa z migracijami
__init__.pysettings.pysettings.py.
manage.py/asgi.py/wsgi.py.SECRET_KEY: ključ za piškotkeINSTALLED_APPS: aplikacije v uporabi, tako uporabniške kot vgrajene (django.contrib.*)DATABASES: podatkovne baze, ki jih uporablja projektTIME_ZONE: časovna conamodels.pydjango.db.models.Model.django.db.models):
CharField, TextField: tekstovni atributiIntegerField ipd.: celoštevilski atributiDecimalField, FloatField: decimalna številaDateField, DateTimeField, TimeField: časovni atributiForeignKey: odnosi ena na večManyToManyField: odnosi več na večpython manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
views.py.
request sprejme zahtevek, ki ga sprejme aplikacija.django.http.HttpResponse ali ustrezno dejanje (napaka, preusmeritev).urls.py določimo poti in zanje ustrezne poglede.
templates znotraj mape aplikacije.django.shortcuts.render, ki ji podamo:
request,templates), in{{ spremenljivka }}: vrednost spremenljivke{% značka argument ... %}: značka z ustrezno funkcionalnostjoosnova.html) lahko znotraj strukture spletne strani definiramo bloke:
{% block ime_bloka %}
...
{% endblock %}
{% extends "osnova.html" %} in na isti način znova definiramo (samo) bloke.
{% url %}:
{% url "ime_poti" argument ... %}
{% url "ime_poti" par1=arg1 ... %}
"ime_poti" je ime, podano s parametrom name pri določitvi poti s funkcijo django.urls.pathchuck = Oseba(ime="Chuck Norris")
Model.objects:
Oseba.objects.all() # vse osebe
Zanr.objects.get(pk=1) # žanr z ID-jem 1
# filmi iz leta 2000, urejeni padajoče po oceni
Film.objects.filter(leto=2000).order_by("-ocena")
# glavne vloge v filmih, dolgih vsaj 200 minut, ki nimajo oznake PG-13
Vloga.objects.filter(film__dolzina__gte=200, mesto=1).exclude(film__oznaka='PG-13')
aggregate lahko uporabimo eno ali več združevalnih funkcij na objektih v bazi:
from django.db.models import Avg, Count, Max, Min, Sum
Film.objects.aggregate(Max("dolzina"), zasluzek=Sum("zasluzek"))
# {'zasluzek': 279926080502, 'dolzina__max': 450}
annotate:
q = Film.objects.annotate(Count("zanri"))
q[0].zanri__count
only in defer poskrbimo, da iz baze preberemo samo podane atribute, oziroma podanih atributov ne preberemo:
Film.objects.only("dolzina", "leto").get(naslov="Jurski park")
Film.objects.defer("opis").get(naslov="Jurski svet")
select_related poskrbi, da se preberejo tudi objekti, na katere se sklicuje navedeni tuji ključ.
Film.objects.filter(naslov__startswith="Jurski").select_related("oznaka")
prefetch_related poskrbi, da se preberejo tudi objekti, povezani z navedenim odnosom več na več.
Film.objects.filter(naslov__startswith="Jurski").prefetch_related("vloge")
</span>
django.db.models.F in django.db.models.Q lahko sestavljamo izraze, ki predstavljajo stolpce oziroma pogoje.
from django.db.models import F, Q
# Filmi, ki so zaslužili vsaj 100 mio dolarjev na oceno
# ali vsaj 5 mio dolarjev na minuto trajanja
Film.objects.annotate(
zasluzek_na_oceno=(F("zasluzek") / F("ocena")),
zasluzek_na_dolzino=(F("zasluzek") / F("dolzina"))
).filter(
Q(zasluzek_na_oceno__gt=100_000_000) |
Q(zasluzek_na_dolzino__gt=5_000_000)
)
chuck.ime = 'Chuck Norris (RIP)'
film.ocena = F('ocena') + 1
save.
chuck.save()
film.save()
from django.db import transaction
with transaction.atomic():
# ukazi, ki naj tvorijo transakcijo
@transaction.atomic
def pogled(request, ...):
...
path("accounts/", include("django.contrib.auth.urls")),
login: prijavalogout: odjavapassword_change: menjava geslapassword_reset: ponastavitev geslaregistration/login.html.POST pošlje podatke na pogled login, in vsebuje:
{% csrf_token %},{{ form.username.html_name }}{{ form.password.html_name }}, ternext z vrednostjo {{ next }}.POST na pogled logout.django.contrib.auth.forms.UserCreationForm.
request.POST, ali pa brez argumentov za prazen obrazec.username, password1 in password2.is_valid preverimo, ali so vpisani podatki veljavni.save shranimo obrazec in tako ustvarimo uporabnika.form.
request.user.user, npr.
{% if user.authenticated %}
Pozdravljen, {{ user.username }}!
{% endif %}
add, change, delete, view, ki jih lahko dodeljujemo uporabnikom.request.user.has_perm lahko preverimo, ali ima trenutni uporabnik ustrezne pravice:
if request.user.has_perm('app.add_model'):
...
perms:
{% if perms.app.add_model %}
<!-- uporabnik lahko dodaja objekte za dani model -->
{% endif %}
</span>