Cours Django
Cours Django
Cours Django
2. Pourquoi Django
Avec Django, vous pouvez faire passer les applications Web du concept au
lancement en quelques heures. Django prend en charge une grande partie des
tracas du développement Web, vous pouvez donc vous concentrer sur l'écriture
de votre application sans avoir à réinventer la roue. C'est gratuit et open source.
(Lien documentation: https://www.djangoproject.com/start/overview/ )
3-1. Python
Python est un langage de programmation puissant et facile à apprendre. Il
dispose de structures de données de haut niveau et permet une approche simple
mais efficace de la programmation orientée objet. Parce que sa syntaxe est
élégante, que son typage est dynamique et qu'il est interprété, Python est un
langage idéal pour l'écriture de scripts et le développement rapide
d'applications dans de nombreux domaines et sur la plupart des plateformes.
(Lien documentation: https://docs.python.org/fr/3/tutorial/ ,
https://www.python.org/ , https://www.python.org/about/ )
Exemple :
py -m venv test_venv
ou avec le raccourci
test_venv\Scripts\activate
4-3. Ajout de l’application noteapp comme application dans notre projet dans le fichier
settings.py. (emplacement : checknote\settings.py)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'noteapp',
]
Les Migrations:
Les migrations sont la manière par laquelle Django propage des modifications que vous
apportez à des modèles (ajout d’un champ, suppression d’un modèle, etc.) dans un
schéma de base de données.
Vous devez imaginer les migrations comme un système de contrôle de versions pour un
schéma de base de données. makemigrations se charge de regrouper vos changements
de modèle dans des fichiers de migration individuels - comme des commits et migrate
est chargé d’appliquer les changements à la base de données.
Les fichiers de migration pour chaque application sont stockés dans un répertoire «
migrations » à l’intérieur de l’application, et sont conçus pour faire partie du code
source et de la distribution de cette application. Les migrations sont créées une fois
sur votre machine de développement, puis exécutées telles quelles sur les machines de
vos collègues, les machines de tests, et finalement sur les machines de production.
4-4-1. Migration initiale(Création des schémas par défaut dont la table des utilisateurs)
py manage.py migrate
4-4-2. Création du super utilisateur
py manage.py createsuperuser
Note : Les informations à fournir
● Nom d’utilisateur
● Email (facultatif)
● Mot de passe
● Confirmation mot de passe (Les 2 mot de passes doivent être identiques)
Les bases :
Model Étudiant
class Etudiant(models.Model):
matricule = models.CharField(unique=True,max_length=50)
nom = models.CharField(max_length=50)
prenom = models.CharField(max_length=50)
date_nais = models.DateField()
telephone = models.CharField(unique=True, max_length=20)
classe = models.CharField(max_length=50)
def __str__(self):
return self.nom + " " + self.prenom
Model Notes
class Note(models.Model):
etudiant = models.ForeignKey(Etudiant, on_delete=models.CASCADE)
evaluation = models.CharField(max_length=50)
. . .
class Meta:
verbose_name = "NOTE"
verbose_name_plural = "NOTES"
def __str__(self):
# return str(self.etudiant)
return self.evaluation
admin.site.register(Etudiant)
admin.site.register(Notes)
Création des class admin
class EtudiantAdmin(admin.ModelAdmin):
list_display = ['matricule','nom', 'prenom', 'genre', 'classe', ]
list_filter = ('nom', 'genre')
search_fields = ('nom', 'prenom',)
class NoteAdmin(admin.ModelAdmin):
list_display = ['python', 'base_donne', 'ccna', 'calculeMoyenne' ]
list_filter = ('etudiant',)
search_fields = ('etudiant__nom', 'etudiant__prenom',)
admin.site.register(Etudiant, EtudiantAdmin)
admin.site.register(Notes, NoteAdmin)
Les vues(views)
Une fonction de vue, ou vue pour faire simple, est une fonction Python acceptant une
requête web et renvoyant une réponse web. Cette réponse peut contenir le contenu
HTML d’une page web, une redirection, une erreur 404, un document XML, une image…
ou vraiment n’importe quoi d’autre. La vue elle-même contient la logique nécessaire pour
renvoyer une réponse. Ce code peut se trouver à l’emplacement de votre choix, pour
autant qu’il soit dans le chemin Python. Il n’y a pas d’autres exigences, pas de « magie »
comme on dit. Mais comme il faut bien mettre ce code quelque part, la convention est de
placer les vues dans un fichier nommé views.py se trouvant dans un projet ou un
répertoire d’application.
(Pour plus d’information : https://docs.djangoproject.com/fr/4.1/topics/http/views/)
def index(request):
return render(request, 'noteapp/index.html')
def notes(request):
note_list = Notes.objects.filter(etudiant__matricule=request.POST['matricule'])
context = {'note_list': note_list}
Les Templates(Gabarits) :
Par sa nature liée au Web, Django a besoin d’un procédé agile de génération dynamique
de HTML. L’approche la plus couramment utilisée est de se baser sur des gabarits.Un
gabarit contient la partie statique du résultat HTML souhaité ainsi qu’une certaine
syntaxe particulière définissant comment insérer le contenu dynamique.
Pour plus d’informations : https://docs.djangoproject.com/fr/4.1/topics/templates/
Gabarits
Un gabarit est un fichier texte. Il peut générer tout format basé sur du texte (HTML,
XML, CSV, etc.).
Un gabarit contient des variables qui sont remplacées par des valeurs lorsque le gabarit
est évalué, ainsi que des balises qui contrôlent la logique du gabarit.
Voici un gabarit minimal illustrant quelques principes de base. Chaque élément sera
ensuite expliqué plus loin dans ce document.
Variables
Une variable affiche une valeur à partir du contexte, qui est un objet de type
dictionnaire faisant correspondre des clés à des valeurs.
Les variables sont entourées par {{ et }} comme ceci :
Balises
Les balises permettent d’appliquer une logique arbitraire dans le processus de rendu.
Cette définition est volontairement vague. Par exemple, une balise peut produire du
contenu, servir de structure de contrôle telle qu’une instruction « if » ou une boucle «
for », extraire du contenu d’une base de données ou même de donner accès à d’autres
balises de gabarit.
Les balises sont entourées par {% et %}, comme ceci (quelques balises) :
{% csrf_token %}
Balise pour les urls
{% url 'nom url' %}
Balise pour faire une condition
{% if condition %} Bonjour, {{ user.username }}.{% endif %}
Balise pour parcourir un ensemble d'élément (Liste d’objet par exemple)
{% for elt in list%}
Le nom est : {{ elt.nom }}.
{% endif %}
Pour faire des commentaires
{% comment %} Ceci est un commentaire {% endcomment %}
Pour permettre le chargement de fichiers static(js, css) dans le fichier html
{% load static %}
Pour hériter d’un template
{% extends 'nom_application/nom_fichier.html' %}
Redéfinir le contenu d’un template (héritage)
{% block content %} Le contenu ici {% endblock %}
{% extends 'noteapp/base.html' %}
{% load static %}
{% block content %}
<div class="card">
<div class="card-header">
<h1>Formulaire de Recherche</h1>
</div>
<div class="card-body">
<div >
<form action="{% url 'notes' %}" method="post">
{% csrf_token %}
<fieldset>
<div class="row">
<label for="matricule" class="">Numéro matricule</label>
<input type="text" class="form-control" name="matricule"
placeholder="Entrez votre numero matricule ici">
</div>
</fieldset>
<input type="submit" class="btn btn-primary" value="Chercher">
</form>
</div>
</div>
</div>
{% endblock content %}
La page notes: notes.html (chemin : noteapp/templates/noteapp/notes.html)
{% extends 'noteapp/base.html' %}
{% load static %}
{% block content %}
<div class="container">
<h2>Les Notes : </h2>
<tbody>
{% for note in note_list %}
<tr>
<td>{{ note.etudiant }}</td>
<td>{{ note.semestre }}</td>
<td>{{ note.python }}</td>
<td>{{ note.base_donne }}</td>
<td>{{ note.ccna }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock content %}
Gestion des URL
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('noteapp.urls'))
]
urlpatterns = [
path('', views.index, name="index"),
path('notes', views.notes, name="notes"),
]