Formation Django

publicité
Présentation
Notre premier projet
Exercice final
Formation Django
Maxime Arthaud
Mardi 17 novembre 2014
Présentation disponible sur http://www.bde.enseeiht.fr/clubs/
net7/supportFormations/django/2014
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Django ?
Un framework
Gestion des requêtes et des URL
Interface vers une base de données
Formulaires
Authentification des utilisateurs
...
. . . mais pas un CMS
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Django ?
Un framework
Gestion des requêtes et des URL
Interface vers une base de données
Formulaires
Authentification des utilisateurs
...
. . . mais pas un CMS
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Django ?
Un framework
Gestion des requêtes et des URL
Interface vers une base de données
Formulaires
Authentification des utilisateurs
...
. . . mais pas un CMS
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Django ?
Un framework
Gestion des requêtes et des URL
Interface vers une base de données
Formulaires
Authentification des utilisateurs
...
. . . mais pas un CMS
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Django ?
Un framework
Gestion des requêtes et des URL
Interface vers une base de données
Formulaires
Authentification des utilisateurs
...
. . . mais pas un CMS
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Django ?
Un framework
Gestion des requêtes et des URL
Interface vers une base de données
Formulaires
Authentification des utilisateurs
...
. . . mais pas un CMS
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Django ?
Un framework
Gestion des requêtes et des URL
Interface vers une base de données
Formulaires
Authentification des utilisateurs
...
. . . mais pas un CMS
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Django ?
Un framework
Gestion des requêtes et des URL
Interface vers une base de données
Formulaires
Authentification des utilisateurs
...
. . . mais pas un CMS
Attention
Version actuelle : Django 1.7.1 (Python 2 et 3)
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Architecture
Requête
URL
Template
Vue
Modèle
Réponse (HTML)
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Utilisation d’un virtualenv
Création d’un virtualenv :
$ virtualenv -p python3 env
Activation d’un virtualenv :
$ source env/bin/activate
Gestion des paquets d’un virtualenv :
(env) $ pip install django==1.7.1
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Créer un site Django
$ django-admin.py startproject monsite
$ tree monsite/
monsite
+-- manage.py
+-- monsite
+-- __init__.py
+-- settings.py
+-- urls.py
+-- wsgi.py
$ cd monsite
$ python manage.py migrate
$ python manage.py runserver
[...]
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Votre 1e vue !
1
Créez un fichier monsite/views.py
2
Copiez y le code suivant :
from django.http import HttpResponse
def home(request):
return HttpResponse(’Hello’)
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
La gestion des URLs
1
Ouvrez le fichier monsite/urls.py
2
Modifiez le code pour avoir :
from django.conf.urls import patterns, \
include, url
urlpatterns = patterns(’’,
url(r’^$’, ’monsite.views.home’),
)
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
URLs et expressions régulières
# ... suite de l’urlpattern dans urls.py
(r’^annee/(\d{4})$’, ’monsite.views.annee’),
(r’^aff/(?P<texte>.+)/$’, ’monsite.views.aff’),
# vues associees dans views.py
def annee(request, year):
return HttpResponse(’On est en %s’ % year)
def aff(request, texte):
return HttpResponse(’Bonjour %s’ % texte)
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Première application
$ python manage.py startapp monapp
$ ls monapp
__init__.py models.py tests.py views.py
1
ajouter l’application dans le tuple INSTALLED_APPS de
settings.py
2
bonne pratique : monapp/urls.py
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Découplage des URLs
# Rajouter cet urlpattern dans monsite/urls.py
url(r’^monapp/’, include(’monapp.urls’))
# monapp/urls.py
from django.conf.urls import patterns, include, url
urlpatterns = patterns(’monapp.views’,
url(r’^$’, ’index’),
url(r’^info$’, ’info’),
)
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Création d’un modèle
1
Configurer la base de donnée dans settings.py
2
Créer les modèles
3
Générer les tables à partir du modèle
Page de référence sur la configuration des bases de données : https:
//docs.djangoproject.com/en/dev/ref/settings/#databases
Page de référence sur les champs des modèles :
https://docs.djangoproject.com/en/dev/ref/models/fields/
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Premier modèle
# monapp/models.py
from django.db import models
class Article(models.Model):
nom = models.CharField(verbose_name="Nom de l’article"\
, max_length=128)
description = models.TextField(max_length=512)
prix = models.DecimalField(decimal_places=2, max_digits=6)
def __str__(self):
return self.nom
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Création de la base de donnée
Système de migrations :
$ python manage.py makemigrations
Mise à jour de la base de données :
$ python manage.py migrate
Visualiser une base de donnée sqlite :
$ sqliteman db.sqlite3
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Premières requêtes
$ python manage.py shell
Manipuler les modèles :
Modele.objects.all()
Modele.objects.get()
Modele.objects.filter()
entree.delete()
entree.save()
Pages de référence :
https://docs.djangoproject.com/en/dev/topics/db/queries/
https:
//docs.djangoproject.com/en/dev/ref/models/querysets/
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Les Templates
Template = page html liée à une vue
1
configurer TEMPLATE_DIRS dans settings.py
2
définir les variables affichées/utilisées par le template et
les regrouper dans un dictionnaire
3
changer la vue pour quelle renvoie render(request,
’montemplate.html’, dictionnaire)
Pages de référence :
https://docs.djangoproject.com/en/dev/ref/templates/api/
https://docs.djangoproject.com/en/dev/ref/templates/
builtins/?from=olddocs
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Exemple d’utilisation
La vue
from monapp.models import Article
from django.shortcuts import render
def index(request):
c = {’articles’: Article.objects.all()}
return render(request, ’index.html’, c)
Le template index.html
<h1>Liste des articles</h1>
<ul>
{% for a in articles %}
<li>{{ a.nom }}</li>
{% endfor %}
</ul>
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Etendre des blocs
Page principale, main.html
<html lang="fr">
<head><title>{% block title %}{% endblock %}</title></head>
<body>
<h1>Bienvenue !</h1>
{% block content %}{% endblock %}
</body>
</html>
Page affichage.html qui va étendre main.html
{%
{%
{%
Du
{%
extends "main.html" %}
block title %}Le titre de ma page{% endblock %}
block content %}
contenu ici.
endblock %}
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
A la main
Définition du formulaire, forms.py
from django import forms
class InscriptionForm(forms.Form):
login = forms.CharField(required=True)
password = forms.CharField(label=’Mot de passe’,
required=True, widget=forms.PasswordInput)
code = forms.IntegerField()
Son template, edit.html
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Vue d’un formulaire
from django.shortcuts import redirect
def inscription(request):
if request.method == ’POST’:
form = InscriptionForm(request.POST)
if form.is_valid():
# Faire qqch avec les donnees..
return redirect(’monapp.views.merci’)
else:
form = InscriptionForm()
return render(request, ’inscription.html’, {’form’: form})
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
A partir d’un modèle
Formulaire, forms.py
class ArticleForm(models.ModelForm):
class Meta:
model = Article
fields = (’login’, ’password’, ’code’)
Vue, views.py
objet = get_object_or_404(Article, pk=1)
if request.method == ’POST’:
form = ArticleForm(request.POST, instance=objet)
if form.is_valid():
form.save()
return redirect(objet)
else:
form = ArticleForm(instance=objet)
return render(request, ’edit.html’, {’form’: form})
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Vues et urls
Les modèles
Les Templates
Les formulaires
Interface d’administration
Interface d’administration
1
Décommenter les lignes concernant l’interface
d’administration dans settings.py et urls.py
2
Mettre à jour les tables (syncdb)
3
Pour chaque application, indiquer les modèles pris en
charge par l’interface d’administration via un fichier
admin.py comme suit :
from monapp.models import Modele1, Modele2
from django.contrib import admin
admin.site.register(Modele1)
admin.site.register(Modele2)
net7
Formation Django
Présentation
Notre premier projet
Exercice final
Exercice : FaceMash
Cahier des charges, fonctions à implémenter :
ajouter/éditer un utilisateur (Nom, adresse mail, photo) via
un formulaire
visualiser une liste des utilisateurs triée selon leur score
visualiser le profil d’un utilisateur
enregistrer les votes : date, vote, ip du votant (on est
méchant)
afficher la liste des votes
vote : afficher les photos de 2 utilisateurs choisis
aléatoirement, le vote s’effectue en cliquant sur l’une des
photos
interface d’administration
net7
Formation Django
Téléchargement