====== Django framework: frontend ======
[[Django]] és un framework web basat en Python molt popular. Està orientat a la rapidesa de desenvolupament, per això se'l coneix com "The web framework for perfectionists with deadlines".
En aquest article tenim per objectius:
* Entendre el funcionament bàsic del paradigma MTV (Model-Template-View) de Django.
* Clarificar el seu funcionament abans de seguir amb els tutorials oficials en les parts 2,3,6.
* Entendre la separació per capes i l'aïllament del codi del disseny.
* Veure alguns casos d'ús típics.
{{ django-logo.png?300 }}
{{tag> #FpInfor #Daw #DawMp07 #DawMp07Uf2 #DawMp07Uf02 #DawMpDual Django Python web framework }}
\\
===== Referències =====
Referències:
* Site oficial: [[http://djangoproject.com]]
* [[Django]] en aquesta wiki: setup, administració i posada en producció.
* [[https://docs.djangoproject.com/en/stable/intro/tutorial01/|Tutorial oficial de Django]]
* [[https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django|Tutorial Django a MDN Mozilla]].
* [[https://docs.djangoproject.com/en/stable/topics/forms/|Treballant amb Forms]]
* [[https://stackoverflow.com/questions/1622793/django-cookies-how-can-i-set-them|Cookies en Django]]
* [[Integració de Django amb React]]
La documentació de Django és molt bona, tant en les referències tècniques com el [[https://docs.djangoproject.com/en/stable/intro/tutorial01/|tutorial oficial de Django]], així que seguirem aquests per anar aprofundint.
El tutorial oficial toca els següents temes:
- Base i admin panel : parts 1, 2, 7
- Views al frontend : parts 3, 4, 6
- Testing : part 5
Per seguir aquest exercici cal haver fet prèviament la part de //base i admin panel//.
===== MVC vs MTV =====
El //frontend// de Django es basa en el paradigma MVC (Model-Vista-Controlador) però que en la versió Django té una petita variant: MTV (Model-Template-View).
Model VIEW Controller
Model Template VIEW
Així que anem amb compte perquè la nomenclatura pot oferir confusió. Les //views// de Django (MTV) són en realitat el //controller// del MVC, és a dir, la part on tenim el codi.
{{ :django.png?600 |}}
===== Primer exercici de Django frontend =====
Un cop fet les parts 1,2,7 (//backend//) del tutorial, podem seguir aquesta guia per introduir-nos al //frontend//. Es recomana fer aquesta intro abans que el tutorial parts 3,4,6.
Si has fet el tutorial parts 1,2,7, has de tenir un projecte a la carpeta //mysite// amb una aplicació anomenada //polls//, on podeu crear preguntes (Questions) i respostes (Options) per a enquestes.
===== Afegir una nova URL (index) =====
==== Crear una pàgina index ====
Si no l'has fet abans, caldrà que enllacis una url buida (urls.py de mysite) amb una funció //index// a l'arxiu ''polls.views''
A l'arxiu urls.py de mysite afegeix:
from polls import views as pollviews
urlpatterns = [
path( '', pollviews.index ),
...
]
Visita la URL http://localhost:8000/ on hauries de veure el contingut de la view "index" (molt simple, amb HttpResponse). Si no tenies creada la view '''polls.views.index'' , crea-la ara:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
==== Afegir nou arxiu de urls a la app "polls" ====
Enllaceu les urls de la app "polls" amb un include a l'arxiu urls.py de //mysite//.
Afegeix a mysite/urls.py:
...
from django.urls import path, include
urlpatterns = [
...
path('polls/', include("polls.urls")),
...
]
I afegiu l'arxiu ''urls.py'' amb el contingut:
from django.urls import path, include
from . import views
urlpatterns = [
path('', views.index ),
]
Ara teniu disponible la //view// index des de 2 URLs diferents:
http://localhost:8000/
http://localhost:8000/polls/
\\
===== Crear nova view llista =====
Si aneu a la URL http://localhost:8000/polls/llista ens donarà un error pq encara no hem creat la //view// (codi) ni la seva ruta.
Afegim ''polls/urls.py'':
from . import views
urlpatterns = [
...
path('llista', views.llista ),
...]
Creem la nova //view// (codi):
from django.shortcuts import render
from django.contrib.auth.models import User
...
def llista(request):
items = User.objects.all()
return render( request, "llista.html" )
==== Afegir un template (plantilla) ====
Crea nova carpeta ''polls/templates''.
A dins crearem l'arxiu ''polls/templates/llista.html'' amb el contingut (després veurem com funciona):
llista
llistat de... {{tipus}}
{% for element in elements %}
- {{element}}
{% endfor %}
Si et dona un error ''TemplateDoesNotExist'' inclús si has creat la carpeta ''template'', probablement necessites afegir la app al ''settings.py'':
INSTALLED_APPS = [
'django.contrib.admin',
...
'polls',
]
==== Renderitzar dades des de la view ====
Per poder visualitzar el contingut del //template// crearem aquest codi dins de ''polls/views.py'':
def llista(request):
items = User.objects.all()
return render( request, "llista.html",
{
"tipus":"coses",
"elements":items
}
)
\\
===== Filtrat amb paràmetres GET =====
En moltes aplicacions haurem de recuperar paràmetres GET de la //request//. En aquest podem restringir les ''Options'' que visualitzem filtrant pel ID de la ''Question'' corresponent (enllaçada per FK). Ho podem fer així:
def llista(request):
items = None
if request.GET.get("qid"):
items = Option.objects.filter( question__id=request.GET["qid"] )
else:
items = Option.objects.all()
return render( request, "llista.html",
{
"tipus":"coses",
"elements":items
}
)
Per visualitzar només les dades d'una ''Question'', ho farem afegint un paràmetre GET a la mateixa URL que estem fent:
http://localhost:8000/polls/llista?qid=2
**Fixa't en la funció //filter//, com creus que funciona?**
\\
===== Formularis =====
Pel //frontend// ens serà molt important la potent gestió de formularis de Django.
Referències sobre formularis:
* [[https://docs.djangoproject.com/en/stable/topics/forms/|Forms]]
* [[https://docs.djangoproject.com/en/stable/topics/forms/modelforms/|ModelForms]]
* [[https://docs.djangoproject.com/en/stable/ref/models/fields/|Fields]] : camps del Form
* [[https://docs.djangoproject.com/en/stable/ref/forms/fields/#fields-which-handle-relationships|Camps amb FKs]]
* [[https://docs.djangoproject.com/en/stable/topics/class-based-views/generic-display/|Generic Views]]: per operacions tipus CRUD genèriques es poden crear formularis molt ràpidament, ja que ens genera tant el codi de la //view// com el //template//.
Altres:
* https://docs.djangoproject.com/en/stable/topics/http/shortcuts/
Un formulari sempre implica diverses passes:
- Crear el formulari (pot ser senzill o més complex, i necessitarà codi).
- Processar les dades del formulari.
- Mostrar un resultat: pot ser senzill (operació OK), o complex (mostrar classificació). Sovint és molt pràctic fer una redirecció cap a una altre //view// i repartir la complexitat en diverses parts del codi.
Cada pas abans descrit pot necessitar el seu **template** i la seva **view**. A la //view// crearem i filtrarem les dades adequades per passar-les al //template//.
En Django tenim, al menys, 4 aproximacions per a realitzar formularis:
- Plantilla //hardcoded// (HTML): dona més feina però és fàcil de modificar amb coneixements bàsics de HTML.
- Utilitzar objecte ''Form'' de Django. Això ens facilita la renderització i el manteniment.
- Utilitzar objectes més sofisticats com ''ModelForm'' que a partir d'un model ens generarà automàticament el formulari.
- Utilitzar [[https://docs.djangoproject.com/en/stable/topics/class-based-views/generic-display/|generic views com DetailView]] : les operacions tipus CRUD es poden fer amb aquests objectes genèrics.
El processament del formulari és sempre similar (menys en el cas de les //generic views//).
\\
Podeu veure mes exemples a l'article [[Django Lliga#formularis|Django Lliga: formularis]].
\\
===== Autenticació =====
En el frontend és important utilitzar la [[Django Auth]].
\\