Maxime Arthaud Mardi 17 novembre 2014 Présentation disponible sur http://www.bde.enseeiht.fr/clubs/ /supportformations/django/2014
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
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
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
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
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
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
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
Django? Attention Un framework Gestion des requêtes et des URL Interface vers une base de données Formulaires Authentification des utilisateurs...... mais pas un CMS Version actuelle : Django 1.7.1 (Python 2 et 3)
Architecture Requête URL Template Vue Modèle Réponse (HTML)
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
Créer un site Django Présentation $ 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 [...]
Votre 1e vue! Présentation 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 )
La gestion des URLs Présentation 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 ), )
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)
Première application Présentation $ 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
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 ), )
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/
Premier modèle Présentation # 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
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
Premières requêtes Présentation $ 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/
Présentation 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
Exemple d utilisation Présentation 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>
Etendre des blocs Présentation 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 {% extends "main.html" %} {% block title %}Le titre de ma page{% endblock %} {% block content %} Du contenu ici. {% endblock %}
A la main Présentation 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>
Vue d un formulaire Présentation 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})
A partir d un modèle Présentation 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})
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)
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