Je créais une sorte de site Web de boutique en ligne et je ne suis pas en mesure de faire fonctionner correctement mon option d'ajout au panier. Je n'ai pas encore lié le reste du code au bouton et j'utilise un autre lien pour l'actionner actuellement comme vous pouvez le voir dans le code.Je veux que le formulaire soumette automatiquement le nom de l'article et la marque. Veuillez suggérer un moyen.

Urls.py

url(r'^(?P<pk>[0-9]+)/addtocart/$', views.ItemAdd.as_view(), name='addtocart'),

Models.py

class Mycart(models.Model):
    name = models.CharField(max_length=250)
    brand = models.CharField(max_length=250)
    quantity = models.IntegerField(default='1')

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('products:detail', kwargs={'pk': self.pk})

Views.py

class ItemAdd(CreateView):
    model = Mycart
    fields = ['name', 'brand', 'quantity']
    template_name = 'products/add_to_cart.html'

    def get_context_data(self, **kwargs):
        context = super(ItemAdd, self).get_context_data(**kwargs)
        return context

Add_to_cart.html

{% extends 'products/base.html' %} {% block body %}

<form action="" method="post" enctype="multipart/form-data">
  {% csrf_token %}
  <input type="hidden" name="name" value="{{ object.name }}">
  <input type="hidden" name="brand" value="{{ object.brand }}">
  <br>
  <p>Enter Quantity</p>
  <input type="number" name="quantity" value="">
  <button type="submit" class="btn btn-success">Submit</button>

</form>

{% endblock %}
1
Nikhil Khandelwal 17 janv. 2017 à 16:29

2 réponses

Meilleure réponse

Je comprends que, lorsque l'utilisateur clique sur l'article (produit), vous souhaitez ajouter automatiquement le nom et la marque au formulaire, donc l'utilisateur n'a qu'à entrer la quantité et soumettre le formulaire? Peut-être que vous pouvez essayer comme ceci:

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        product_pk = self.kwargs['pk']
        product = Product.objects.get(pk=product_pk)
        context.update({
            'product': product
        })
        return context

Vous pouvez maintenant accéder au produit dans votre modèle et obtenir le nom et la marque:

   {{ product.name }}
   {{ product.brand }}
0
Vladyslav Moisieienkov 25 janv. 2017 à 11:19

Vous pouvez utiliser un Formview. Ensuite, vous aurez:

Models.py

class Cart(models.Model):
    quantity = models.PositiveIntegerField()
    product = models.ForeignKey('products.Product')

Forms.py

class AddCartForm(forms.ModelForm):
    def save(self, product):
        instance = super(AddCartForm, self).save(commit=False)
        instance.product = product
        instance.save()
        return instance

    class Meta:
        model = Cart
        fields = '__all__'

Views.py

class AddCartView(FormView):
    form_class = AddCartForm
    success_url = '/'

    def dispatch(self, request, *args, **kwargs):
        product_pk = kwargs.get('product_pk')
        self.product = get_object_or_404(Product, pk=product_pk)
        return super(
            AddCartView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kw):
        context = super(AddCartView, self).get_context_data(**kw)
        context.update(product=self.product)
        return context

    def form_valid(self, form):
        form.save(product=self.product)
        return super(AddCartView, self).form_valid(form)

Add_cart.html

{% extends 'products/base.html' %} {% block body %}

<form action="{% url 'cart:add' product.pk %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form }}
<button type="submit" class="btn btn-success">Submit</button>
</form>

{% endblock %}
0
Josue Ttito 25 janv. 2017 à 11:42