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
name
stocke le nom du produit.description
permet de stocker la description du produit.price
gère le prix du produit avec deux décimales.stock
représente la quantité de produit disponible en stock.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')
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'),
]
''
affiche la liste des produits.product/<int:pk>/
affiche les détails d'un produit spécifique.product/new/
permet d'ajouter un nouveau produit.product/<int:pk>/edit/
permet de modifier un produit.product/<int:pk>/delete/
permet de supprimer un produit.Créez les templates pour afficher la liste des produits, les détails, le formulaire d'ajout/modification, et la confirmation de suppression.
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>
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.