Application Blog
Le blog du pauvre
Conception et développement de l'application blog qui illustre ce projet de documentation.
Les points abordés:
- model de donnée
- les formulaires
- les views et routage
Conception de la base de données :
Pour faire simple, nous allons créer une table post composé simplement : title, content, date_posted et author. Dans le fichier models.py dans l'application blog de notre projet, on crée la classe post. Je vous invite à lire la doc et le tutoriel de Django.
# blog/models.py
from django.contrib.auth.models import User
from django.db import models
from django.utils import timezone
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(auto_now_add=True, editable=False)
author = models.ForeignKey(User, on_delete=models.CASCADE)
Une fois la classe écrite, on va générer la migration et modifier la base de données :
python manage.py makemigrations
Un nouveau fichier compose le dossier migrations.
Il est nécessaire d'appliquer la migration, sinon le projet n'accède pas à la table post.
python manage.py migrate
Cette commande va appliquer le nouveau SQL à la base de données du projet.
Création d'un post avec le tableau de bord de django :
A partir de ce moment, il est possible d'alimenter la table post. On va utiliser l'admin de django pour faire simple. Le tableau de bord est a cette adresse en local : http://127.0.0.1:8000/admin/
python manage.py runserver
Oh mais dis donc ! Impossible de créer un post ! la table n'est pas visible!!
La magie opére dans le fichier admins.py, on peut manipuler a notre convenance (ou presque) le tableau de bord. On va ajouter la table post et paramétrer l'administration.
- Importer le model Post
- Ecrire la classe PostAdmin
from django.contrib import admin
from blog.models import Post # 1 : import de nos models
# 2 : Ecriture de la classz PostAdmin
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ("id", "title", "date_posted", "author", "content")
# afficher un champ de recherche
search_fields = ("title",)
# ajouter des filtres
list_filter = ("date_posted",)
Maintenant, on a bien l'application blog avec la table Post dans le tableau de bord, on peut écrire le premier article du blog.
Dernière étape views et urls :
Dans le fichier blog/views.py, Je vais vous montrer 2 façons de faire une vue, la fonction et la classe générique de Django. La doc Django
La fonction :
from django.shortcuts import render
from blog.models import Post
def index(request):
return render(request, "index.html", {
"posts": Post.objects.all(),
"title": "fonction",
})
La classe générique ListView :
from django.shortcuts import render
from django.views.generic import ListView
class PostListView(ListView):
model = Post
template_name = 'index.html'
context_object_name = 'posts'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "PostListView"
return context
On va aussi ajouter un fichier html dans un des dossier template
<!DOCTYPE html>
<html lang="FR">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h1>Projet de documentation django : {{ title }}</h1>
{% for post in posts %}
<p>{{ post.title }}</p>
<p>{{ post.content }}</p>
{% endfor %}
</body>
</html>
Pour finir cette partie il faut faire le lien entre l'url et la view avce le fichier "myapp/urls.py":
# myapp/urls.py
from django.contrib import admin
from django.urls import path
from blog import views as b_views # la fonction
from blog.views import PostListView # la vue générique
urlpatterns = [
path("admin/", admin.site.urls),
path("", b_views.index, name="home"),
path("blog/", PostListView.as_view(), name="blog"),
]
Et voilà le resultat : on retrouve les deux articles avec l'url à la racine / et l'autre en blog/
Enfin, on a du contenu. On va aller encore plus loin.
Prochainement, on ajoutera a la classe Post du texte enrichi pour le corps de texte avec django-tinymce, une image pour faire jolie et autre !