Je suis en train de faire un site avec le framework django, et je rencontre un problème. Tout d'abord, j'ai deux tables une "produit" qui contient l'ensemble de mes produits, par exemple :
tee-shirt
jean
chaussure
Puis, j'ai une table commande qui est destinée à accueillir la commande de chaque personne, on a donc : id_utilisateur/ id_produit/ quantité. Par exemple :
1 / 2/ 3
2/ 1/ 4
etc ...
Or, j'aimerais créer un formulaire qui permette d'afficher (dans un tableau) le nom des produits, puis un champs de formulaire permanentant de commander la quantité voulu !!
J'ai pas mal essayé avec les formulaires groupés, mais je n'ai pas réussi.
Je n'ai pas vraiment compris... Si tu veux gérer plusieurs tableaux, comme une sorte de base de donnée, je te conseille d'apprendre SQL. Sinon, je voudrais bien t'aider, mais je ne comprends pas trop...
- Edité par bergiLeZÉR0 4 mars 2019 à 16:18:22
"I believe in two things. Discipline and the Bible." The Shawshank Redemption
Si tu pouvais poster tes models complet, je peux t'aider.
Tu souhaite afficher un tableau qui te permet de lister tes produit, et de les commander en indiquant une quantité, c'est bien ça ?
C'est exactement cela.
Voici mes models :
from django.db import models
from django.contrib.auth.models import User
class Produit(models.Model):
nom = models.CharField(verbose_name="Nom du produit", max_length=255)
prix = models.FloatField(verbose_name="Prix du produit")
afficher = models.BooleanField(verbose_name="Afficher le produit ?", help_text="Si vous voulez que le produit soit afficher, rentrer 1 sinon 0 !!")
poids = models.FloatField(verbose_name="Poids du produit", help_text="Si le produit peut être vendu en plus petite quantitées")
maximun = models.IntegerField(verbose_name="Qunatité maximun du produit", help_text="Quantité maximun commandable par une seul personne", default=100)
step = models.FloatField(verbose_name="Incrémentation", help_text="Rentrer ici de combien voulez-vous que la quantité augmente à chaque clique de l'utilisateur", default=1)
def __str__(self):
return self.nom
class Commande(models.Model):
utilisateur = models.ForeignKey(User, on_delete=models.CASCADE, related_name="utilisateur")
produit = models.ForeignKey("Produit", on_delete=models.CASCADE, related_name="produit")
quantité = models.FloatField(verbose_name="Quantités du produit", default=0)
def __str__(self):
return "{0} commandé {1} par {2}".format(self.produit.nom, self.quantité, self.utilisateur.username)
Mon but est de crée un formulaire en django (donc de juste faire dans ma vue {{ form.as_p }} ) afin d'afficher le formulaire complet, listant les produits et affichant un champs input pour rentrer la quantité.
Créer un formulaire Django est relativement simple pour faire quelque chose de basique.
Par contre, je ne saurais pas spécialement te dire si cela est possible que form.as_p te retourne un tableau qui intègre un formulaire. Car ici, il s'agit bien d'un tableau qui dépend d'un formulaire ou inversement. Tu peux voir de ce côté-là sur le manuel Django : https://docs.djangoproject.com/en/1.9/topics/forms/formsets/
Personnellement, ce que je ferai à te place, c'est de passer par quelque chose de plus classique et plus facile (selon moi)
Rien ne t'empêche de créer tout ça directement dans ton template en HTML.
if request.method == 'POST':
if 'Produit' in request.POST:
produit = request.POST['Produit']
#Fais ce que tu veux avec la donnée ici
A bien y regarder, tu as surtout un problème dans la conception de ton modèle Commande.
Comme tu l'écris, ça veut dire qu'une commande est composée d'un utilisateur, un produit et une quantité. Mais si je veux commander plusieurs produits ? Ta logique veut qu'il faut créer une seconde ligne dans la base de données qui inscrira mon nom et deuxième produit et sa quantité. Mais alors, comment identifier ma commande dans sa totalité au final ? Il n'y a aucun numéro de commande !
La logique de Django voudrait que ton modèle utilise un ManyToManyField:
class Commande(models.Model):
numero = models.IntergerField()
utilisateur = models.ForeignKey(User, on_delete=models.CASCADE, related_name="utilisateur")
produit = models.ManyToManyField("Produit")
quantité = models.FloatField(verbose_name="Quantités du produit", default=0)
Sauf que, tu as autre problème aussi, la quantité. Chaque produit doit avoir une quantité propre. Ça devient un peut trop complexe pour moi, mais si je ne dis pas de bêtise, ton modèle au final doit être comme cela :
class Commande(models.Model):
numero = models.IntergerField()
utilisateur = models.ForeignKey(User, on_delete=models.CASCADE, related_name="utilisateur")
produit = models.ManyToManyField(Produit, through='Quantite')
class Quantite(Models.Model)
produit = models.ForeignKey(User, on_delete=models.CASCADE, related_name="utilisateur")
quantite = models.IntegerField()
Merci beaucoup pour ta réponse, j'ai un peu modifié tes classes et j’obtiens ceci :
class Produit(Model):
nom = CharField(max_length=255, verbose_name="Nom du produit")
description = RichTextField(null=True)
prix = FloatField(default=1)
class Commande(Model):
numero = IntegerField()
utilisateur = ForeignKey(User, on_delete=CASCADE, related_name="utilisateur")
produit = ManyToManyField(Produit, through='Quantite')
class Quantite(Model):
produit = ForeignKey(Produit, on_delete=CASCADE, related_name="produit")
commande = ForeignKey(Commande, on_delete=CASCADE, related_name="commande")
quantite = IntegerField()
Ça marche nickel pour mon utilisation, merci beaucoup !
Da-max
[Résolu] [Django] Formulaire lié à deux tables
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Da-max
"I believe in two things. Discipline and the Bible." The Shawshank Redemption
https://www.lamontagnesolitaire.fr - Toute l'actualité de la Terre du Milieu
Da-max
https://www.lamontagnesolitaire.fr - Toute l'actualité de la Terre du Milieu
Da-max