Je développe une app dans un projet Django qui me permet de gérer des produits, des fournisseurs, et ... des commandes.
Voici les models:
def defaultlist():
return [
(15, "produit1"),
(1, "produit2"),
(2, "produit3")
]
class ProdCat(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField()
class Meta:
verbose_name = "Info | Catégorie"
verbose_name_plural = "Info | Catégorie"
ordering = ['name']
def __str__(self):
return self.name
class ProdWei(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField()
class Meta:
verbose_name = "Info | Poids"
verbose_name_plural = "Info | Poids"
ordering = ['name']
def __str__(self):
return self.name
class ProdTemp(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField()
class Meta:
verbose_name = "Info | Température"
verbose_name_plural = "Info | Température"
ordering = ['name']
def __str__(self):
return self.name
class ProdLoc(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField()
class Meta:
verbose_name = "Info | Lieu"
verbose_name_plural = "Info | Lieu"
ordering = ['name']
def __str__(self):
return self.name
class OrdTime(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField()
class Meta:
verbose_name = "Info | Date"
verbose_name_plural = "Info | Date"
ordering = ['name']
def __str__(self):
return self.name
class Supplier(models.Model):
name = models.CharField(max_length=100)
phone = models.IntegerField()
email = models.EmailField()
street = models.CharField(max_length=100, blank=True)
zip = models.IntegerField(blank=True)
city = models.CharField(max_length=100)
country = models.CharField(max_length=100, blank=True)
slug = models.SlugField()
class Meta:
verbose_name = "- Fournisseur"
verbose_name_plural = "- Fournisseurs"
ordering = ['name']
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=100)
quantity = models.IntegerField(default=0, blank=True)
category = models.ForeignKey(ProdCat, on_delete=models.CASCADE)
weight = models.ForeignKey(ProdWei, blank=True, null=True, on_delete=models.CASCADE)
temp = models.ForeignKey(ProdTemp, blank=True, null=True, on_delete=models.CASCADE)
stand = models.ManyToManyField(Group, blank=True)
supplier = models.ForeignKey(Supplier, blank=True, null=True, on_delete=models.CASCADE)
stock = models.ForeignKey(ProdLoc, on_delete=models.CASCADE)
slug = models.SlugField()
class Meta:
verbose_name = "- Produit"
verbose_name_plural = "- Produits"
ordering = ['name']
def get_stand(self):
return format_html_join('', '{}<br>', ([s.name] for s in self.stand.all()))
def __str__(self):
return self.name
class Order(models.Model):
datecom = models.DateTimeField(default=timezone.now, verbose_name="Date de commande")
when = models.ForeignKey(OrdTime, on_delete=models.CASCADE, blank=True, null=True)
stand = models.ForeignKey(Group, on_delete=models.CASCADE)
user = models.CharField(max_length=100, blank=True, null=True)
products = JSONField(default=defaultlist)
status = models.BooleanField(default=False)
dateliv = models.DateTimeField(verbose_name="Date de livraison", blank=True, null=True)
slug = models.SlugField()
class Meta:
verbose_name = "- Commande"
verbose_name_plural = "- Commandes"
ordering = ['dateliv']
def get_products(self):
return format_html_join('', '{} : {} <br>', ([(product, score) for score, product in self.products]))
def __str__(self):
return self.slug
Les autres class correspondent à des catégories qui me permettent de définir un peu plus les produits.
Le souci vient du model Order, qui permet donc de stocker les commandes (date de commande, date de livraison souhaité, le group qui passe la commande etc.)
ET ... le JSONField qui stock une liste de produits commandés, avec la quantité demandé.
Mon problème est que je bloque pour la création du formulaire.
Alors oui, je peux utiliser les modelForm de Django, mais ce n'est pas le résultat que je souhaite.
Pour plus de simplicité, en front l'utilisateur qui passera la commande aura la liste des produits et pour chaque, un input integer pour récupérer la quantité.
Le formulaire doit pouvoir:
récupérer le Group du User connecté, pour remplir le champs stand du model Order
le username, jusque là tout va bien
et récupérer les produits qui ont un input quantité > 0 pour les stocker dans le champs products du model Order
{% extends "base.html" %}
{% block title %}
Order us | Kanli
{% endblock title %}
{% block content %}
<h1>Commandez pour {{ user.groups.all.0 }}</h1>
<form action="" method="POST">{% csrf_token %}
{% for product in object_list %}
<p><label for="id{{ product.id }}">{{ product.name }}</label>
<input type="number" name="id{{ product.id }}" value=""></p>
{% endfor %}
<input type="submit" value="Save" />
</form>
{% endblock %}
J'ai une boucle pour afficher autant d'input "quantité" que d'article, avec le label qui s'y rattache, pour afficher visuellement le nom du produit.
Je récupère bien les données POST, mais il faudrait du coup, que je puisse faire une boucle dans le post() de la classe TestOrderList pour récupérer chaque binome nom_du_produit/quantité et ainsi pouvoir le format comme ça
et pouvoir le save dans le champs JSONField 'products' du model Order ...
Up, une idée de comment faire ça ?
- Edité par MatthieuCharnacé 23 septembre 2019 à 14:26:21
Matthieu Charnacé
[Django] App de Gestion de commandes/produits
× 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.
Matthieu Charnacé