Vues et modèles — Rendu de la liste des articles

Dans ce chapitre, vous apprendrez à utiliser les vues Django pour récupérer des données depuis la base de données et, avec les modèles, à afficher la liste des cartes d'articles sur la page d'accueil du blog.


Le rôle des vues (View)

Les vues constituent la couche de logique centrale de Django et sont responsables de :

  • Recevoir les requêtes des utilisateurs (requestparamètre)
  • Interrogation de la base de données pour obtenir les données requises
  • Passer les données aux templates pour rendre le HTML et le renvoyer à l'utilisateur.

Les vues Django peuvent s'écrire de deux manières :Vue basée sur fonction (FBV)et vues basées sur des classes (CBV).

Dans les huit premiers chapitres, nous privilégions les FBV (vues basées sur des fonctions) — elles sont plus intuitives et conviennent mieux aux débutants pour comprendre le processus de traitement des requêtes.


Bases des vues fonctionnelles

Une fonction de vue Django reçoitrequestParamètres et valeurs de retourHttpResponseObjet.

Exemple

# Chemin du fichier : blog/views.py
from django.shortcuts import render
from .models import Post

def index(request):
    """Page d'accueil du blog : affiche tous les articles"""
    # Récupérer tous les articles depuis la base de données (par ordre chronologique inverse)
    posts = Post.objects.all().order_by('-created_at')

    # Les trois paramètres de render :
    # 1. request — objet de requête
    # 2. Chemin du template — blog/index.html
    # 3. dictionnaire de contexte — données transmises au template
    context = {
        'posts': posts,
        'title': 'EXAMPLE Blog - Accueil'
    }
    return render(request, 'blog/index.html', context)

render()C'est la fonction raccourcie la plus couramment utilisée dans Django, combinant : chargement des templates → injection des données → génération du HTML → retour des réponses.


Syntaxe des templates Django

La syntaxe des templates Django est très similaire à la syntaxe des templates Vue3, mais il existe quelques différences clés.

ObjectifTemplates DjangoTemplate Vue3
Variables de sortie{{ variable }}{{ variable }}
Boucles{% for item in list %}...{% endfor %}v-for="item in list"
Conditions{% if cond %}...{% endif %}v-if="cond"
Génération d'URL{% url 'name' %}router-link to="name"
Héritage de la mise en page{% extends 'base.html' %}Imbrication de composants

Différence clé : les templates Django utilisent{% %}Balises de contrôle englobantes ; Vue3 utilisev-directives. Dans les gabarits Django,côté serveurrendu—le HTML est généré puis envoyé au navigateur ; Vue3 effectueun rendu côté navigateur—le navigateur reçoit le JS puis assemble le HTML.


Héritage de gabarit : base.html

Lorsque plusieurs pages partagent la même barre de navigation et le même pied de page, utilisezl'héritage de gabaritpour éviter la duplication.

Le gabarit parent définit des blocs, et les gabarits enfants remplissent un contenu spécifique.

Créer le gabarit parent base.html

Exemple

<!-- Chemin du fichier : blog/templates/blog/base.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}EXAMPLE Blog{% endblock %}</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            background: #f5f5f5;
            color: #333;
        }
        .navbar {
            display: flex; justify-content: space-between; align-items: center;
            padding: 16px 40px; background: #fff;
            box-shadow: 0 2px 8px rgba(0,0,0,0.1);
        }
        .navbar .logo { font-size: 22px; font-weight: bold; color: #2c3e50; text-decoration: none; }
        .navbar a { margin-left: 20px; text-decoration: none; color: #333; }
        .container { max-width: 960px; margin: 40px auto; padding: 0 20px; }
        .footer { text-align: center; padding: 20px; color: #999; border-top: 1px solid #eee; }
        .section-title { font-size: 24px; margin-bottom: 20px; }
    </style>
    {% block extra_head %}{% endblock %}
</head>
<body>
    <!-- Barre de navigation -->
    <header class="navbar">
        <a href="/" class="logo">EXAMPLE Blog</a>
        <nav>
            <a href="/">Accueil</a>
            <a href="#">À propos</a>
        </nav>
    </header>

    <!-- Zone de contenu principale (remplie par le template enfant) -->
    <main class="container">
        {% block content %}
        {% endblock %}
    </main>

    <!-- Pied de page -->
    <footer class="footer">
        <p>© 2024 EXAMPLE Blog. Propulsé par Django.</p>
    </footer>
</body>
</html>

Créer le template enfant index.html

Exemple

<!-- Chemin du fichier : blog/templates/blog/index.html -->
<!-- extends doit être au tout début -->
{% extends 'blog/base.html' %}

{% block title %}{{ title }}{% endblock %}

{% block content %}
<h2 class="section-title">Derniers articles</h2>

{% if posts %}
    <div class="article-grid">
        {% for post in posts %}
        <div class="article-card">
            <div class="card-content">
                <span class="card-category">{{ post.category.name }}</span>
                <h3>{{ post.title }}</h3>
                <p>{{ post.summary|truncatechars:80 }}</p>
                <span class="card-date">{{ post.created_at|date:"Y-m-d" }}</span>
            </div>
        </div>
        {% endfor %}
    </div>
{% else %}
    <p class="empty-tip">Aucun article pour le moment, restez à l'écoute.</p>
{% endif %}
{% endblock %}

Plusieurs notions utilisées dans les templates :

SyntaxeSignification
{% extends 'blog/base.html' %}L'héritage du template parent doit être écrit sur la première ligne
{% block content %}...{% endblock %}Remplissez le bloc de contenu défini dans le template parent.
{{ post.category.name }}Accéder aux propriétés des objets liés via des clés étrangères
{{ post.summary|truncatechars:80 }}Filtre : tronquer aux 80 premiers caractères
{{ post.created_at|date:"Y-m-d" }}Filtre : formater la date

Dans les templates Django,FiltreUtiliser le symbole pipe|Indique, placé après une variable, utilisé pour une sortie formatée. Filtres courants :date、truncatechars、length、default。


Ajout de styles à la liste d'articles

Ajoutez le CSS suivant à la balise style dans base.html :

Exemple

/* Mise en page en grille des cartes d'articles */
.article-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 24px;
}

.article-card {
    background: #fff;
    border-radius: 12px;
    overflow: hidden;
    box-shadow: 0 2px 12px rgba(0,0,0,0.08);
    transition: transform 0.2s, box-shadow 0.2s;
}

.article-card:hover {
    transform: translateY(-4px);
    box-shadow: 0 8px 24px rgba(0,0,0,0.12);
}

.card-content {
    padding: 20px;
}

.card-category {
    display: inline-block;
    padding: 2px 10px;
    background: #E8EEF5;
    color: #3D71A6;
    border-radius: 12px;
    font-size: 12px;
    margin-bottom: 8px;
}

.article-card h3 {
    font-size: 18px;
    margin-bottom: 8px;
    color: #222;
}

.article-card p {
    font-size: 14px;
    color: #666;
    line-height: 1.6;
    margin-bottom: 12px;
}

.card-date {
    font-size: 12px;
    color: #999;
}

.empty-tip {
    text-align: center;
    color: #999;
    padding: 60px 0;
    font-size: 16px;
}

Exercice pratique : Vérifier l’effet de la page d’accueil

Assurez-vous que les points suivants sont réalisés :

  • Les modèles Post et Category sont définis dans models.py et ont été migrés
  • Au moins 3-5 articles ont été saisis dans le back-office d’administration (affectés à différentes catégories).
  • La fonction index dans views.py interroge les articles de la base de données et les transmet au template.
  • La route / dans urls.py pointe vers la vue index

Démarrez le serveur et visitez la page d’accueil. Vous devriez voir la liste des cartes d’articles générée dynamiquement à partir des données de la base de données.


Résumé du chapitre

Dans ce chapitre, vous avez maîtrisé la coordination essentielle entre les vues et les templates Django : views.py interroge les données de la base de données et les transmet au contexte, render() effectue le rendu des templates, le template parent base.html définit la mise en page + les blocs, les templates enfants étendent et remplissent le contenu, la syntaxe des templates Django ({{ }}, {% %}, filtres).

La page d’accueil du blog est désormais pilotée par la base de données, et non plus codée en dur.

autres extensions