Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Django] App de Gestion de commandes/produits

Pb de création de formulaire efficace

    22 septembre 2019 à 21:16:00

    Bonjour,

    Voici le contexte :

    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
    les données doivent être dans ce format
    def defaultlist():
        return [
            (15, "produit1"),
            (1, "produit2"),
            (2, "produit3")
        ]

    Le formulaire est là uniquement pour récupérer le dictionnaire produit|quantité et le transmettre au formulaire de création de commande.

    Il y a tellement de relations entre les différents models que je bloque depuis 2 jours.

    Avez-vous une solution ou une voie à suivre pour écrire ce formulaire et le lier au formulaire du model Order ?

    En vous remerciant pour l'aide apporté ! ;)

    EDIT

    Ok, donc j'ai un peu avancé.

    urls.py

    urlpatterns = [
    	path('', views.home),
    	path('home', views.home, name='home'),
    	path('connexion', views.connexion, name='connexion'),
    	path('orders/', ProdOrderList.as_view()),
    	path('contact', views.contact, name='contact'),
    	path('test', TestOrderList.as_view()),
    ]



    ce qui nous concerne ici est l'adresse /test appelle donc TestOrderList que voici :

    class TestOrderList(LoginRequiredMixin, ListView):
        context_object_name = 'product_list'
        template_name = 'stock/test.html'
    
        def get_queryset(self):
            group = self.request.user.groups.values_list('id', flat=True).first()
            self.groups = get_object_or_404(Group, id=group)
            return Product.objects.filter(stand=self.groups)
    
        def post(self, request, *args, **kwargs):
                print(request.POST)
                context = {}
                return render(request, "stock/great.html", context)

    Du coup ça fonctionne pour cette première étape.

    Dans le template :

    {% 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 

    def defaultlist():
        return [
            (15, "produit1"),
            (1, "produit2"),
            (2, "produit3")
        ]

    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

    • Partager sur Facebook
    • Partager sur Twitter

    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.
    • Editeur
    • Markdown