Exercice 3 Django Framework Corrigé S1
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">« 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 »</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.
Pas encore de commentaires.
Ajouter un commentaire
Veuillez vous connecter pour ajouter un commentaire.