Modifier la suppression du panier
Exclusif Premium
Débloquez votre potentiel ! ✨
Cette session fait partie de notre programme Premium exclusif
+100h de formations exclusives
+180 exercices de code avancés
+100h de mentorats en réécriture
20 projets guidés pas à pas
Mentorats groupés hebdomadaires
Support individuel avec nos mentors
Prêt à passer au niveau supérieur ?
Découvrez tous les avantages Premium et transformez votre apprentissage dès aujourd'hui!
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compteToutes les questions

Thomas
4 décembre 2023
Résolue
6 réponses
Bug de mon code, besoin d'un avis
Bonjour,
voici le lien du repo github : https://github.com/TomQuez/DocShop
Quand je supprime le panier coté utilisateur tout se passe bien. Mais quand je supprime le panier coté administrateur, la suppression se fait mais le champ ordered ne passe pas à True, ce qui crée un bug coté utilisateur. après cette suppression coté administrateur, l'utilisateur peut créer un panier mais il sera vide, et impossible d'ajouter des articles. la page du panier s'affiche mais avec un compteur à zero. j'ai beau essayer de supprimer et recréer un panier coté utilisateur, j'ai toujours le meme bug, meme si j'efface les données de navigation, et que je relance le serveur. pour corriger ce bug, il faut aller dans l'interface administrateur et cocher la case ordered pour que le champ ordered passe à True. Après cette manipulation, on peut de nouveau créer un panier coté utilisateur. Donc mon problème est que je ne comprends pas pourquoi le champ ordered ne passe pas pas à True quand je supprime le panier coté administrateur, alors que a priori j'ai bien surchargé la méthode delete()... Une idée ?...

Gabriel Trouvé
14 mars 2023
Résolue
2 réponses
Modifier la suppression du panier
Promis dernière question de la soirée ^^ loldef add_to_cart(request, slug):
user = request.user
product = get_object_or_404(Product, slug=slug)
# le panier : s'il n'existe pas il est créé, sinon on le récupère
cart, _ = Cart.objects.get_or_create(user=user)
# regarde si on a un objet order qui correspond à notre utilisateur et si le produit correspond à product
# ordered = false car on cible article pas déjà été commandé. On va recréer un article et pas modifier l'existant.
order, created = Order.objects.get_or_create(user=user, ordered=False, product=product)
# si le produit n'était pas dans le panier et qu'il est créé
if created:
cart.orders.add(order)
cart.save()
# si déjà dans le panier
else:
order.quantity += 1
order.save()
return redirect(reverse("product", kwargs={"slug": slug}))
J'ai du mal à comprendre le ordered=False dans order, created = Order.objects.get_or_create...En gros si je ne le mets pas on risque d'utiliser un objet Order ayant un ordered=True ? Le ordered=False c'est juste pour créer un nouvel objet Order avec ordered=False ?Merci ^^

Christian Aucane
17 janvier 2023
Résolue
2 réponses
Supprimé = commandé ?
Du coup quand on supprime le panier on considère que l'article est commandé ?
00:00:00 :Dans cette vidéo, on va modifier la suppression du panier puisqu'actuellement on fait cettesuppression directement dans la vue et on a également la suppression des articles dupanier que l'on fait dans cette vue que l'on va devoir modifier puisque cette fois-ci avecle changement qu'on a effectué sur le modèle, on ne va pas vouloir supprimer ces articles,
00:00:17 :on va juste les détacher de notre panier et changer ces deux champs, donc on va direque l'article a été commandé et on va dire à quelle date il a été commandé commeça l'utilisateur pourra avoir un historique des articles qu'il a commandé et on va toutsimplement enlever ces articles du panier. Donc on va devoir effectuer déjà ces modifications
00:00:34 :et ce que je vais faire également c'est déplacer cette logique puisque actuellement elle est dansla vue, donc ça veut dire que pour effectuer la suppression du panier on est obligé de passerpar l'URL et le bouton qu'on avait rajouté sur notre site, donc on avait un bouton supprimer
00:00:47 :le panier qui nous permettait d'accéder à cette vue. Le problème de ça c'est que si par exempleon fait cette suppression au niveau de l'interface d'administration, donc si dans l'interfaced'administration, alors je crois qu'il va falloir que je me reconnecte, donc si dans cette interfaced'administration on avait un panier et qu'on supprimait ce panier, et bien cette logique
00:01:05 :que l'on a à l'intérieur de notre vue elle ne serait pas effectuée. Donc ce qu'on va fairec'est en fait passer par le modèle et on va surcharger la méthode delete, donc la méthodedelete du panier ici, on va créer notre propre méthode delete dans laquelle on va faire ces
00:01:20 :opérations. Donc l'intérêt de faire comme ça c'est que quand on va passer par l'interfaced'administration, quand on supprime un panier via l'interface d'administration ou n'importequelle méthode, quand on passe par exemple par un shell si on fait delete également sur un objetde panier, et bien on va passer par cette méthode delete que l'on va tout de suite modifier. Donc
00:01:37 :je vais la créer, delete, on n'oublie pas le self et on va également récupérer dans args et quarksles différents arguments positionnels ou arguments nommés qu'on pourrait passer à cette méthode. On
00:01:49 :va également à la fin utiliser super, donc là c'est de l'orienter objet, ce qu'on fait c'est qu'onsurcharge cette méthode, on ne va pas la remplacer, donc pour pouvoir avoir le comportement par défautde cette méthode on va devoir appeler la méthode parent, donc la méthode de notre modèle ici. Et
00:02:04 :nous ce qu'on va faire c'est juste entre les deux rajouter la logique qui va nous permettre de faireles modifications sur les articles. Donc on va repasser également ici les args et les quarks
00:02:13 :pour que tout se passe correctement si jamais on passait des arguments à cette méthode delete. Etdonc ensuite qu'est ce qu'on va faire ici ? Et bien on va tout simplement boucler sur les articles,
00:02:22 :donc on va dire for order in self.orders.all, donc on boucle sur tous les articles qui sontattachés au panier. On va ensuite modifier les champs qu'on avait rajoutés, donc le champ
00:02:32 :ordered on va le passer à true, et la date on va faire order.orderedDate, et là on va utiliserun module qui s'appelle timezone, donc on va devoir importer, qui va nous permettre de récupérer ladate et l'heure actuelles avec un objet qu'on appelle aware, donc c'est un objet qui aura des
00:02:47 :informations de fuseau horaire. Donc je vais faire option entrée, je valide import this name, et ilse trouve dans Django utils timezone. Donc ce fuseau horaire sera par défaut en UTC, donc UTC c'est le
00:02:58 :temps universel qui correspond si je me souviens bien au GMT, donc c'est le temps à Londres qui estune heure en moins que le temps à Paris, et donc cette date aura ces informations de fuseau horairemais par rapport à UTC, donc c'est à dire que si jamais par la suite on veut traduire cette
00:03:13 :information dans un fuseau horaire spécifique, il faudra le faire soit dans le template soit ailleurs,mais on ne va pas trop s'attarder là dessus pour l'instant, je veux juste vous montrer donc cetteméthode timezone.now qui nous permet d'avoir ces objets. On aura l'occasion d'y revenir quand on
00:03:25 :voudra afficher ces articles et prendre en compte ce fuseau horaire. Donc ce qu'on va faire pourfinir c'est bien sûr sauvegarder ce modèle, donc order.save, et pour finir en dehors de la boucle
00:03:35 :on va faire self.orders.clear. Donc ça, ça va me permettre de détacher ces éléments puisquevous voyez qu'on avait un many-to-many field, donc ça veut dire qu'on avait une relation entre lesarticles et notre panier, et en utilisant cette méthode clear on va casser cette relation et lesarticles ne seront plus liés à mon panier. Donc comme ça on va avoir des articles qui auront
00:03:55 :l'information de à quelle date et à quelle heure ils ont été commandés, on va également dire qu'ilsont été commandés et on va les supprimer de notre panier. Et donc toute cette logique ici elle va
00:04:04 :être effectuée également via l'interface d'administration. Et pour que les changementssoient répercutés également dans la vue, on va modifier cette ligne ici puisque on n'en a plusbesoin. Donc on va en fait tout simplement l'enlever puisque la logique se passe maintenant
00:04:16 :directement dans cette méthode delete, et en appelant cette méthode delete donc directementsur mon panier, ça va faire toute cette logique ici. Donc on n'a rien besoin de plus. Pour finir,
00:04:25 :la dernière chose qu'on va devoir faire c'est modifier la vue qui nous permet d'ajouter lesarticles au panier, puisque si vous vous souvenez bien dans add to cart ici, on avait cette ligneici qui nous permet de récupérer ou de créer un article. Et pour l'instant ce qu'on faisait
00:04:38 :c'est qu'on lui passait l'utilisateur et le produit. Et donc là comme on a ce champ orderedqui va être true ou false en fonction de si l'article a déjà été commandé ou non, on vadevoir rajouter cette information ici en disant qu'on souhaite cibler uniquement les articles quin'ont pas déjà été commandés. Donc comme ça si on a déjà commandé une paire de sneakers sur le
00:04:56 :site, eh bien on va quand même recréer un article et on ne va pas modifier l'article existant qui luia déjà été commandé. Donc on va pouvoir tester tout ça. Je vais revenir sur mon site, on va
00:05:07 :actualiser ici. Donc là je suis bien connecté, je clique sur voir l'article, je l'ajoute dans lepanier, j'ai bien un article dans le panier. Donc si je reviens ici, je vais avoir mon panier qui
00:05:17 :s'appelle Tibache avec les sneakers, j'en ai une. Donc si on va voir l'order, on a bien les sneakersici qui correspondent à cet article. Pour l'instant le field ici donc ordered est à false et on n'a
00:05:27 :aucune information de date. Si maintenant je supprime le panier, donc vous allez voir je peuxle faire directement depuis ici ou via l'interface et ça va faire la même chose. Donc ici je peux
00:05:36 :cliquer sur supprimer dans l'interface, je valide et si je reviens donc sur order, on a toujoursnotre produit qui est ici, donc l'article des sneakers et cette fois-ci on a bien ordered quiest coché et on a la date et l'heure. Et vous voyez au moment où j'enregistre, je suis à Montréal,
00:05:51 :il est 9h du matin et on a bien cette heure ici qui est 14h18, donc c'est l'heure universelleUTC. Et donc si jamais je repasse une commande cette fois-ci, là on voit que mon panier n'existe
00:06:02 :plus et j'en vais pouvoir, donc si je reviens sur la boutique, recréer un panier. Donc je vaisreprendre le même article, l'ajouter dans le panier et cette fois-ci ça va bien créer unnouvel item. Donc on avait notre premier article ici qui avait été commandé avec la date et l'heure
00:06:15 :et on en a créé un nouveau ici qui lui n'a pas encore été commandé et qui n'a donc pas cesinformations. Et si j'en rajoute un, donc si je rajoute dans le panier, on va voir qu'on a bien
00:06:25 :la quantité qui va avoir été modifiée ici, donc on est passé à 2 et on n'a pas touché au produitici qui est resté à 1. Donc voilà pour ces modifications, le fait de rajouter OrderedFalse
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.