Exercices Django

Exercice 3 Django Framework Corrigé S1

Gestion de produits dans un catalogue

Objectif :

  • Créer une application CRUD (Create, Read, Update, Delete) pour gérer un catalogue de produits.

Instructions :

  1. Créez un modèle Product avec les champs suivants :
    • name (Nom du produit, type CharField)
    • description (Description du produit, type TextField)
    • price (Prix du produit, type DecimalField)
    • stock (Quantité en stock, type IntegerField)
  2. Implémentez des vues basées sur des classes (ListView, DetailView, CreateView, UpdateView, DeleteView) pour gérer les produits.
  3. Créez un formulaire pour ajouter et modifier des produits.
  4. Implémentez un système de pagination pour la liste des produits.
  5. Ajoutez la possibilité de supprimer un produit avec une confirmation avant la suppression.

1. Créer le modèle Product

Dans le fichier models.py de l'application catalogue, créez un modèle Product avec les champs requis.

models.py

# catalogue/models.py
from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.IntegerField()

    def __str__(self):
        return self.name
  • Le champ name stocke le nom du produit.
  • Le champ description permet de stocker la description du produit.
  • Le champ price gère le prix du produit avec deux décimales.
  • Le champ stock représente la quantité de produit disponible en stock.

2. Créer les vues basées sur des classes

Dans le fichier views.py, implémentez les différentes vues pour gérer les produits : liste, détails, création, modification et suppression.

views.py

# catalogue/views.py
from django.urls import reverse_lazy
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from .models import Product

# Liste des produits avec pagination
class ProductListView(ListView):
    model = Product
    template_name = 'catalogue/product_list.html'
    context_object_name = 'products'
    paginate_by = 10  # Pagination avec 10 produits par page

# Détails d'un produit
class ProductDetailView(DetailView):
    model = Product
    template_name = 'catalogue/product_detail.html'
    context_object_name = 'product'

# Ajouter un produit
class ProductCreateView(CreateView):
    model = Product
    template_name = 'catalogue/product_form.html'
    fields = ['name', 'description', 'price', 'stock']
    success_url = reverse_lazy('product_list')

# Modifier un produit
class ProductUpdateView(UpdateView):
    model = Product
    template_name = 'catalogue/product_form.html'
    fields = ['name', 'description', 'price', 'stock']
    success_url = reverse_lazy('product_list')

# Supprimer un produit avec confirmation
class ProductDeleteView(DeleteView):
    model = Product
    template_name = 'catalogue/product_confirm_delete.html'
    success_url = reverse_lazy('product_list')

3. Configurer les URL

Dans le fichier urls.py de l'application catalogue, définissez les URL pour chaque vue.

urls.py

# catalogue/urls.py
from django.urls import path
from .views import ProductListView, ProductDetailView, ProductCreateView, ProductUpdateView, ProductDeleteView

urlpatterns = [
    path('', ProductListView.as_view(), name='product_list'),
    path('product/<int:pk>/', ProductDetailView.as_view(), name='product_detail'),
    path('product/new/', ProductCreateView.as_view(), name='product_create'),
    path('product/<int:pk>/edit/', ProductUpdateView.as_view(), name='product_update'),
    path('product/<int:pk>/delete/', ProductDeleteView.as_view(), name='product_delete'),
]
  • L'URL '' affiche la liste des produits.
  • L'URL product/<int:pk>/ affiche les détails d'un produit spécifique.
  • L'URL product/new/ permet d'ajouter un nouveau produit.
  • L'URL product/<int:pk>/edit/ permet de modifier un produit.
  • L'URL product/<int:pk>/delete/ permet de supprimer un produit.

4. Créer les templates

Créez les templates pour afficher la liste des produits, les détails, le formulaire d'ajout/modification, et la confirmation de suppression.

Template pour la liste des produits (product_list.html)

<!-- catalogue/templates/catalogue/product_list.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Liste des produits</title>
</head>
<body>
    <h1>Liste des produits</h1>
    <a href="{% url 'product_create' %}">Ajouter un produit</a>
    <ul>
        {% for product in products %}
        <li>
            <a href="{% url 'product_detail' product.pk %}">{{ product.name }}</a>
            - {{ product.price }}€
            - {{ product.stock }} en stock
            <a href="{% url 'product_update' product.pk %}">Modifier</a>
            <a href="{% url 'product_delete' product.pk %}">Supprimer</a>
        </li>
        {% endfor %}
    </ul>

    <div>
        {% if is_paginated %}
            <div>
                <span>Page {{ page_obj.number }} sur {{ page_obj.paginator.num_pages }}</span>
            </div>
            <div>
                {% if page_obj.has_previous %}
                    <a href="?page=1">&laquo; Première</a>
                    <a href="?page={{ page_obj.previous_page_number }}">Précédente</a>
                {% endif %}
                {% if page_obj.has_next %}
                    <a href="?page={{ page_obj.next_page_number }}">Suivante</a>
                    <a href="?page={{ page_obj.paginator.num_pages }}">Dernière &raquo;</a>
                {% endif %}
            </div>
        {% endif %}
    </div>
</body>
</html>

Template pour les détails d'un produit (product_detail.html)

<!-- catalogue/templates/catalogue/product_form.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Ajouter/Modifier un produit</title>
</head>
<body>
    <h1>{{ view.object.pk|yesno:"Modifier un produit,Ajouter un produit" }}</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Enregistrer</button>
    </form>
    <a href="{% url 'product_list' %}">Retour à la liste des produits</a>
</body>
</html>

Template pour le formulaire d'ajout/modification d'un produit (product_form.html)

<!-- catalogue/templates/catalogue/product_form.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Ajouter/Modifier un produit</title>
</head>
<body>
    <h1>{{ view.object.pk|yesno:"Modifier un produit,Ajouter un produit" }}</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Enregistrer</button>
    </form>
    <a href="{% url 'product_list' %}">Retour à la liste des produits</a>
</body>
</html>

Template pour la confirmation de suppression (product_confirm_delete.html)

<!-- catalogue/templates/catalogue/product_confirm_delete.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Supprimer le produit</title>
</head>
<body>
    <h1>Supprimer {{ object.name }} ?</h1>
    <p>Êtes-vous sûr de vouloir supprimer ce produit ? Cette action est irréversible.</p>
    <form method="post">
        {% csrf_token %}
        <button type="submit">Supprimer</button>
    </form>
    <a href="{% url 'product_list' %}">Annuler</a>
</body>
</html>

5. Tester l'application

Lancez le serveur de développement pour tester votre application :

python manage.py runserver

Accédez à http://127.0.0.1:8000/ pour voir la liste des produits, ajouter, modifier, et supprimer des produits.

Ajouter un commentaire

Veuillez vous connecter pour ajouter un commentaire.

Pas encore de commentaires.