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