Menu
Tuto

 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.

  1.  Importer le model Post
  2.  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 !

 

Rédigé par ookamy le 6 novembre 2024, dernière mise à jour au 6 novembre 2024