Se positionner dans le dossier voulu pour le project. Dans la ligne de commande: Création du project:
django-admin startprojct blogVérifier être dans le bon dossier en tapant:
ls-> blog/ manage.py Activer le project:
python manage.py runserverDans son IDE, ouvrir le dossier Blog blog/ manage.py blog/ init.py settings.py urls.py asgi.py wsgi.py
Ouvrir le terminal: Créer listings qui hébergera l'application
python manage.py startapp listings Vous devriez avoir listings/ init.py admin.py apps.py migrations/ init.py models.py tests.py views.py
Avec Django vous avez automatiquement Sqlite Pour configurer une base de données MySql: Dans la base de données, créer une table que vous appelerez dans 'NAME' Dans Blog/blog/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'nom du project dans la bdd',
'USER': 'nom du user de la bdd',
'PASSWORD': 'mdp de la bdd',
'HOST': 'host bdd',
'PORT': 'port de la bdd',
}
}Toujours dans settings.py Ajouter l'application listing dans INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.admin',
'...',
'listings',
]Dans Blog/blog/listings/models.py
from django.db import models
class Blog(models.Model):
class Tags(models.TextChoices):
PYTHON = 'py'
PHP = 'php'
LANGAGE = 'lg'
POLITIQUE = 'pol'
SPORT = 'sp'
titre = models.CharField(max_length=255)
description = models.TextField(max_length=1000, null=True)
photo = models.CharField(max_length=255, null=True)
tag=models.CharField(choices=Tags.choices, max_length=10, null=True)Bien faire attention à l'indentation
Il faut créer la class Blog qui est dans models On choisi le nom de la colonne, qui est égal dans le model au type avec des contraintes entre () ex: titre comme nom de colonne pour le type: - CharlField pour les chaines de caractère - IntegerField pour les nombres - TextField pour le texte - URLField pour les urls - ... pour les contraintes: - max_length pour le nombre de caractère max - null = True pour possibilité de case vide - choices = Tags.choices pour les choix multiples pour les choix multiples, il faut créer en amont une class avec les valeurs qui seront affichés et les valeurs insérées dans la bdd
python manage.py makemigrationssi tout est ok
python manage.py migrationLes admins on la possibilité de créer, modifier, ajouter ou même supprimer via ce portail Pour le créer:
python manage.py createsuperuserrenseigner à la suite un identifiant, un mail et un mot de passe (le mot de passe ne s'affiche pas pas mesure de sécurité) Suivre le lien et se connecter
Vous pouvez modifer l'affichage dans de vos colonnes dans le portail Dans Blog/blog/listings/admin.py
# toujours importer les pages nécessaires
from django.contrib import admin
from listings.models import Blog
class BlogAdmin(admin.ModelAdmin):
# indiquer à la suite tous les champs voulus ('titre','...','...')
list_display = ('titre')
admin.site.register(Blog)Dans Blog/blog/listings/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'...',
'django.contrib.sites',
]
SITE_ID = 1# Toujours importer les pages nécessaire
from django.contrib import admin
from django.urls import path
from listings import views
#ici nous auront les routes avec le nom des views.pagesHtml correspondantes et les noms voulus qu'on reprendra dans les passerelles des views
urlpatterns = [
# ici pour la page admin
path('admin/', admin.site.urls),
path('blog/', views.blog_list, name='blog-list'),
path('blog/<int:id>/', views.blog_detail, name='blog-detail'),
path('blog/<int:id>/update/', views.blog_update, name='blog-update'),
path('blog/add', views.blog_add, name='blog-add'),
path('blog/<int:id>/delete/', views.blog_delete, name='blog-delete'),
]# on importe les pages nécessaire
from django.shortcuts import render
from listings.models import Blog
from listings.forms import BlogForm
# Pour le redirect, il faudra insérer des données dans le settings
from django.shortcuts import redirectDans Blog/blog/listings/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'...',
'django.contrib.redirects',
]Dans Blog/blog/listings/views.py Faire une méthode pour chaque tâches
def blog_list(request):
# on prend tous les objects de la table Band
blog = Blog.objects.all()
# on retourne la requete, route de la page hello, table band
return render(request, 'listings/blog_list.html', {'blog': blog})D'abord créer un formulaire dans Blog/blog/listings/forms.py
# on importe les pages nécessaires
from django import forms
from listings.models import Blog
# faire une class Form avec les champs qu'il y a dans Blog et tous les retourner
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
fields= '__all__'Dans Blog/blog/listings/views.py
def blog_add(request):
# si la requete est en methode POST, soit qu'elle se trouvera dans le corps
if request.method == 'POST':
# on récupère le formulaire
form = BlogForm(request.POST)
# si le formulaire est valide
if form.is_valid():
# créer une nouvelle ligne de « Blog » et la sauvegarder dans la bdd
blog = form.save()
# redirige vers la page où tous les articles sont affichés du groupe que nous venons de créer
return redirect('blog-list')
# sinon on reste sur le formulaire
else:
form = BlogForm()
return render(request,
'listings/blog_add.html',
{'form': form})def blog_detail(request, id):
# get permet de retourner un seul objet
# get(id=id) veut dire 'obtenez moi l'objet qui a cet id'
blog = Blog.objects.get(id=id)
return render(request, 'listings/blog_detail.html', {'blog': blog})Ne pas oublier de faire des liens pour pouvoir modifier
<a href="{% url 'blog-update' blog.id %}" class="ms-4"> Modifier cet article</a>def blog_update(request, id):
blog = Blog.objects.get(id=id) # get car un récupère un seul élément
if request.method == 'POST':
form = BlogForm(request.POST, instance=blog)
# on prérempli le formulaire avec un groupe existant grace a instance
if form.is_valid():
# si le formulaire est valide
# mettre à jour le groupe existant ds la base de données
form.save()
#on redirige vers le détail de l'article
return redirect('blog-detail', blog.id)
else:
# sinon on reste sur cette page avec le formulaire prérempli
form = BlogForm(instance=blog)
return render(request, 'listings/blog_update.html', {'form': form})Ne pas oublier de faire des liens pour supprimer
<a href="{% url 'blog-delete' blog.id %}">Supprimer</a>def blog_delete(request, id):
blog = Blog.objects.get(id=id)
if request.method == "POST":
# supprimer le groupe de la base de données
blog.delete()
# rediriger vers la liste des groupes
return redirect('blog-list')
# pas besoin de « else »
return render(request,
'listings/blog_delete.html',
{'blog': blog})Créer des pages html voulus, soit dans ce cas: Dans Blog/blog/listings/templates/listings
base.html
blog_list.html
blog_add.html
blog_detail.html
blog_edit.html
blog_delete.html
Dans la base, importer le css, scripts souhaités, nav et footer et autres éléments qui se répercutera sur toutes les pages du site
Sur toutes les pages hors base.html Il faut extends base.html pour que les propriétés s'étendent {% extends "listings/base.html" %}
Pour la page d'affichage des articles, faire une boucle FOR pour afficher tous les articles de la table Blog
{% for blog in blog %}
<h5>{{ blog.titre }}</h5>
<p>{{ blog.description }}</p>
{% endfor %}Styliser au choix, ici le style est fait avec Boostrap
Si on écrit
{{ blog.tag }}
, sera affiché la valeur écrit dans la bdd Il faut écrire{{ blog.get_tag_display }}
Pour les formulaires d'ajout et de modification:
<form action="" method="POST" class="text-center">
<!-- pour échapper aux attaques -->
{% csrf_token %}
<!-- form permet de récupérer tous les éléments du formulaire directement -->
{{ form.as_p }}
<input type="submit" value="Envoyer">
</form>Pour la suppression, il est mieux de demander la confirmation de suppression
Quelques soit la page, bien mettre des liens pour revenir sur les pages précédentes et la page d'acccueil Revenir aux articles