Das Hinzufügen von Produkten zum Warenkorb funktioniert nicht ordnungsgemäß

Abrar:

Ich habe ein Problem mit dem Code, genauer gesagt einen Fehler. Wenn ich zum ersten Mal einen Artikel in den Warenkorb lege (mit Variationen, sagen wir grün und mittel), wird er gut hinzugefügt. Wenn ich dann ein weiteres Element hinzufüge (sagen wir blau und klein), funktioniert es auch. Aber wann erhöhe ich die Artikelmenge von derorder_summary.htmlEs erhöht die Menge des anderen Elements, nicht das, auf das ich geklickt habe (wenn ich auf Rot und Mittel geklickt habe, wird die Menge von Blau und Groß erhöht) und sagt: Bitte geben Sie die erforderlichen Variationen an. Warum passiert dies? Es ist auch erwähnenswert, dass es gut funktioniert, wenn ich denselben Artikel mit denselben Variationen von meiner einzelnen Produktseite hinzufüge. Ich denke, dieser Fehler tritt aufgrund der Art und Weise auf, wie meine Ansichten geschrieben sind. Ich habe versucht, es selbst zu lösen, aber ich verliere mich. Kann mir bitte jemand helfen? Danke im Voraus!

Meine models.py:

class Item(models.Model):
   title = models.CharField(max_length=120)
   price = models.FloatField()

class Variation(models.Model):
   item = models.ForeignKey(Item, on_delete=models.CASCADE)
   name = models.CharField(max_length=50) # size, color

class ItemVariation(models.Model):
   variation  = models.ForeignKey(Variation, on_delete=models.CASCADE)
   value = models.CharField(max_length=50) # small, medium large etc

class OrderItem(models.Model):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
   item  = models.ForeignKey(Item, on_delete=models.CASCADE)
   item_variations = models.ManyToManyField(ItemVariation)
   quantity = models.IntegerField(default=1)
   ordered = models.BooleanField(default=False)

class Order(models.Model):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
   ref_code = models.CharField(max_length=20)
   ordered = models.BooleanField(default=False)
   items = models.ManyToManyField(OrderItem)
   start_date = models.DateTimeField(auto_now_add= True)
   ordered_date = models.DateTimeField()

Meine views.py:

@login_required
def add_to_cart(request, slug):
    item = get_object_or_404(Item, slug=slug)
    variations = request.POST.getlist('variations', [])
    print(variations)
    print(request.POST)
    minimum_variation_count = Variation.objects.filter(item=item).count()
    print(minimum_variation_count)
    print(len(variations))
    if len(variations) < minimum_variation_count:
        messages.info(request, "Please specify the required variations.")


    order_item_qs = OrderItem.objects.filter(
        item=item,
        user= request.user,
        ordered=False,
    )

    for v in variations:
        print(v)
        order_item_qs = order_item_qs.filter(
            item_variations__value=v
        )

    if order_item_qs.exists():
        order_item = order_item_qs.first()
        order_item.quantity += 1
        # messages.success(request, "Product quantity was updated.")
        order_item.save()
    else:
        order_item = OrderItem.objects.create(
            item=item,
            user= request.user,
            ordered=False,
        )

        # order_item.item_variations.add(*variations)
        item_variations_to_add = ItemVariation.objects.filter(
                variation__item=item,
                value__in=variations
            ).values_list('id', flat=True)
        order_item.item_variations.add(*item_variations_to_add)
        order_item.save()

    order_qs = Order.objects.filter(user=request.user, ordered=False)
    if order_qs.exists():
        order = order_qs[0]
        if not order.items.filter(item__id=order_item.id).exists():
            order.items.add(order_item)
            # print(request.POST.getlist('variations', None)) 
            messages.success(request, "Product added to cart.")
            return redirect("order-summary")
    else:
        ordered_date = timezone.now()
        order = Order.objects.create(user=request.user, ordered_date=ordered_date)
        order.items.add(order_item)
        # print(request.POST.getlist('variations', None)) 
        messages.success(request, "Product added to cart.")
        return redirect("order-summary")
    return redirect("order-summary")


@login_required
def remove_single_item_from_cart(request, slug):
    item = get_object_or_404(Item, slug=slug)
    variations = request.POST.getlist('variations', [])
    order_qs = Order.objects.filter(
        user=request.user,
        ordered=False
    )
    if order_qs.exists():
        order = order_qs[0]
        # check if the order item is in the order
        if order.items.filter(item__slug=item.slug).exists():
            order_item = OrderItem.objects.filter(
                item=item,
                user=request.user,
                ordered=False
            )[0]
            if order_item.quantity > 1:
                order_item.quantity -= 1
                order_item.save()
                messages.info(request, "Product quantity was updated.")
            else:
                order.items.remove(order_item)
                order_item.delete()
                messages.info(request, "Product was removed from cart.")
            return redirect("order-summary")
        else:
            messages.info(request, "Product was not in your cart")
            return redirect("product", slug=slug)
    else:
        messages.info(request, "You do not have an active order")
        return redirect("product", slug=slug)
    return redirect("order-summary")

Meine order_summary.html (wo ich die Menge erhöhen kann):


<th scope="row" class="border-0">
  <div class="p-2">
    <img src="{{ order_item.item.image_url }}" alt="" width="70" class="img-fluid rounded shadow-sm">
      <div class="ml-3 d-inline-block align-middle">
        <h5 class="mb-1"> <a href="{{ order_item.item.get_absolute_url }}" class="text-dark
        -inline-block align-middle">{{ order_item.item.title }}</a>
        {% for var in order_item.item_variations.all %}
          <!-- <h6>{{ order_item.item_variations.all }}</h6> -->
          <!-- <ul> -->
            <!-- <li><h6>{{ var.variation.name }}: {{ var.value }}</h6></li> -->
          <!-- </ul> -->
          <h6>{{ var.variation.name }}: {{ var.value }}</h6>
        {% endfor %}
      </div>
  </div>
</th>
{% if order_item.item.discount_price %}
  <td class="border-0 align-middle"><strong>${{ order_item.get_total_discount_item_price }} <span class="badge badge-warning">Saving ${{ order_item.get_amount_saved }}</span></strong></td>
{% else %}
  <td class="border-0 align-middle"><strong>${{ order_item.get_total_item_price }}</strong></td>
{% endif %}
    <td class="border-0 align-middle"><strong>
      <div class="pull-center">
          <a href="{% url 'remove-single-item-from-cart' order_item.item.slug %}" class="btn mr-2"><i class="fa fa-minus"></i></a>
          {{ order_item.quantity }}<a href="{% url 'add-to-cart' order_item.item.slug %}" class="btn ml-2"><i class="fa fa-plus"></i></a>
        </div>      
      </div>
      </strong></td>
    <td class="border-0 align-middle"><a href="{% url 'remove-from-cart' order_item.item.slug %}" class="text-dark"><i class="fa fa-trash"></i></a></td>
  </tr>

Meine single_product.html (Ich kann meine Produktmenge von hier aus erhöhen und es funktioniert korrekt):

<form class="form" method="POST" action="{{ object.get_add_to_cart_url }}">
                    {% csrf_token %}
                      {% for var in object.variation_set.all %}
                        <h5>Choose {{ var.name }}</h5>
                        <select class="form-control mb-4 col-md-4" name="variations">
                          {% for item in var.itemvariation_set.all %}
                            <option value="{{ item.value }}">{{ item.value|capfirst }}</option>
                          {% endfor %}
                        </select> 
                      {% endfor %}


                    <div class="action">
                      <button class="btn btn-success">Add to Cart</button>
                      <button class="like btn btn-danger" type="button"><span class="fa fa-heart"></span></button>
                    </div>
                  </form>

Meine admin.py:

from django.contrib import admin
from .models import Item, Variation, ItemVariation


class ItemVariationAdmin(admin.ModelAdmin):
    list_display = ['variation',
                    'value']

    list_filter = ['variation', 'variation__item']
    search_fields = ['value']


class ItemVariationInLineAdmin(admin.TabularInline):
    model = ItemVariation
    extra = 1


class VariationAdmin(admin.ModelAdmin):
    list_display = ['item',
                    'name']
    list_filter = ['item']
    search_fields = ['name']
    inlines = [ItemVariationInLineAdmin]

admin.site.register(Item)
admin.site.register(ItemVariation, ItemVariationAdmin)
admin.site.register(Variation, VariationAdmin)

Meine urls.py:

path('add_to_cart/<slug>/', orders_views.add_to_cart, name='add-to-cart'),
path('remove_from_cart/<slug>/', orders_views.remove_from_cart, name='remove-from-cart'),
MattRowbum:

Sie haben in den Kommentaren erwähnt, dass Sie jetzt Lösungen benötigen, um die OrderItem-Mengen sowohl zu erhöhen als auch zu verringern. Es ist Zeit, einen anderen Ansatz zu wählen.

Diese Lösung bietet eine Ansicht, die Änderungen an der Menge der bestellten Artikel (Plus und Minus) berücksichtigt. Es wird der OrderItemPrimärschlüssel verwendet, der viel zuverlässiger ist als eine Kombination aus Item.pk und Variationen.

Fügen Sie dies hinzu zu views.py:

@login_required
def update_qty(request):
    if request.method == 'POST':
        item_slug = request.POST.get('item_slug', None)
        # Check for an order_item
        order_item_pk = request.POST.get('order_item', None)
        order_item = OrderItem.objects.filter(pk=order_item_pk).first()
        if not order_item:
            messages.info(request, "Product was not in your cart")
            return redirect("product", slug=item_slug)
        # Check for an active order
        order = Order.objects.filter(user=request.user, ordered=False).first()
        if not order:
            messages.info(request, "You do not have an active order")
            return redirect("product", slug=item_slug)
        # Check that order_item is in active order
        if not order_item.order == order:
            messages.info(request, "Product was not in your cart")
            return redirect("product", slug=slug)
        # Update quantities 
        action = request.POST.get('action', None)
        if action == "plus":
            order_item.quantity += 1
            order_item.save()
            messages.info(request, "Product quantity was updated.")
        elif action == "minus":
            order_item.quantity -= 1
            if order_item.quantity < 1:
                order_item.delete()
                messages.info(request, "Product was removed from cart.")
            else
                order_item.save()
                messages.info(request, "Product quantity was updated.")
    return redirect("order-summary")

Fügen Sie dies zu Ihrem hinzu urls.py:

path('update-qty', orders_views.update_qty, name='update-qty'),

In der order_summary.htmlNähe der Unterseite, ersetzt diese:

<div class="pull-center">
    <a href="{% url 'remove-single-item-from-cart' order_item.item.slug %}" class="btn mr-2"><i class="fa fa-minus"></i></a>
    {{ order_item.quantity }}<a href="{% url 'add-to-cart' order_item.item.slug %}" class="btn ml-2"><i class="fa fa-plus"></i></a>
    </div>
</div>

Mit so etwas:

<div class="pull-center">
    <form method="POST" action="{% url 'update-qty' %}">
        {% csrf_token %}
        <button type="submit" name="action" value="minus" class="btn mr-2"><i class="fa fa-minus"></i></button>
        {{ order_item.quantity }}<button type="submit" name="action" value="plus" class="btn ml-2"><i class="fa fa-plus"></i></button>
        <input type="hidden" name="item_slug" value="{{ order_item.item.slug }}">
        <input type="hidden" name="order_item" value="{{ order_item.pk }}">
    </form>
</div>

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Erlaube nur das Hinzufügen zum Warenkorb von Produkten derselben übergeordneten Kategorie in WooCommerce

Deaktivieren Sie das Hinzufügen von WooCommerce-Produkten zum Warenkorb für einen bestimmten Metawert des benutzerdefinierten Taxonomiebegriffs

Einfache PHP-Anfrage zum Abrufen und Echo von "Produkten" aus dem Warenkorb funktioniert nicht?

Hinzufügen von 2 Produkten zum Warenkorb mit 1 Schaltfläche zum Hinzufügen zum Warenkorb Shopify

Fügen Sie beim Hinzufügen von Produkten zum Warenkorb in WooCommerce automatisch Verpackungen hinzu

Das Hinzufügen von .className zum Objekt funktioniert nicht

Das Hinzufügen von Realm android zum Flatterprojekt funktioniert nicht

Das Hinzufügen einer aktiven Klasse zum Listenelementklick funktioniert nicht ordnungsgemäß

WooCommerce Ajax zum Warenkorb hinzufügen Menge funktioniert nicht

Die automatische Skriptgenerierung zum Hinzufügen von zwei Zahlen funktioniert nicht ordnungsgemäß

Das Aktualisieren der Artikelmenge in einem Warenkorb funktioniert nicht ordnungsgemäß

Hinzufügen von Produkten in den Warenkorb von sku auf prestashop

Das dynamische Hinzufügen von Ansichten und das Festlegen von Parametern und Regeln funktioniert nicht ordnungsgemäß (Android)

Das Hinzufügen von Unteransichten zum Anpassen von UIView funktioniert nicht wie erwartet

Das Sortieren von Dezimaldaten funktioniert nicht ordnungsgemäß

Hinzufügen von Artikeln zum Warenkorb

Selen in Python kann das Element zum Hinzufügen zum Warenkorb auf Amazon / Flipkart nicht finden

Das dynamische Hinzufügen von Methoden zum Objekt funktioniert nicht richtig (setattr)

Javascript Das Hinzufügen von Daten zum Array funktioniert nicht ganz gut

Das Hinzufügen der Funktion zum Drucken von Verzeichnissen zu Windows Explorer funktioniert nicht

Das Hinzufügen eines Elements zum globalen Status von React funktioniert nicht?

Zum Warenkorb hinzufügen funktioniert nicht mit dem Sub-Store in Magento

Die Schaltfläche zum leeren Warenkorb auf der Woocommerce-Warenkorbseite funktioniert nicht ordnungsgemäß

WooCommerce Vermeiden Sie das Hinzufügen zum Warenkorb für nicht angemeldete Benutzer

Fehler bei: WooCommerce Vermeiden Sie das Hinzufügen zum Warenkorb für nicht angemeldete Benutzer

Das Hinzufügen einer Rolle zum Knoten funktioniert nicht

Sequelize: Das Hinzufügen eines Tages zum Datum funktioniert nicht

Hinzufügen von Eingabefiltern zum Anzeigen von Produkten, Angular

Die Methode zum Hinzufügen zu einer verknüpften Liste funktioniert nicht ordnungsgemäß

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  3. 3

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  4. 4

    Eclipse Oxygen - Projekte verschwinden

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Wie kann ich den Kaskadenmodus global einstellen?

  7. 7

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  8. 8

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  9. 9

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  10. 10

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  11. 11

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  12. 12

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  13. 13

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  14. 14

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  15. 15

    Wie wählt man Unterschiede mit drei Tabellen aus?

  16. 16

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  17. 17

    Wie kann ich meine Tabelle abfragen, um sie in mySQL nach 2 Feldern zu gruppieren?

  18. 18

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  19. 19

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  20. 20

    Modbus Python Schneider PM5300

  21. 21

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

heißlabel

Archiv