Задать вопрос
@denismatveyev7

Django — реализация корзины?

models.py:

class Product(models.Model):
    sku = models.CharField(max_length=50)
    price = models.DecimalField(decimal_places=2, max_digits=10)


class CartItem(models.Model):
    cart = models.ForeignKey('Cart', null=True, blank=True)
    item = models.ForeignKey(Product)
    quantity = models.PositiveIntegerField(default=1)
    item_total_price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)


class Cart(models.Model):
    total = models.DecimalField(max_digits=100, decimal_places=2, default=0.00)

forms.py:

class ProductsForm(forms.Form):
    products = forms.ModelChoiceField(label=u'Products', queryset=Product.objects.all())

views.py:

class CartView(FormView):
    template_name = 'cart.html'
    form_class = ProductsForm

    def get(self, request, *args, **kwargs):
        cart_id = self.request.session.get("cart_id")
        if cart_id == None:
            cart = Cart()
            cart.save()
            cart_id = cart.id
            self.request.session["cart_id"] = cart_id
        cart = Cart.objects.get(id=cart_id)
        if not request.is_ajax():
            form = self.get_form()
            return self.render_to_response(self.get_context_data(form=form, cart=cart))

        if request.is_ajax():
            item_id = request.GET.get("product")
            item_instance = get_object_or_404(Product, id=item_id)
            cart_item, created = CartItem.objects.get_or_create(cart=cart, item=item_instance)
            if not created:
                cart_item.quantity += 1
                cart_item.save()

            data = {}
            return JsonResponse(data)

cart.html:

{% block jquery %}

    $('.btn-default').click(function(e){
        var product = $('select option:selected').val();
        var data = {product: product};
        $.ajax({
            type: 'GET',
            url:'{% url "cart" %}',
            data: data
        });
    });

{% endblock %}

{% block content %}

<div class="container">
    <div class="row products">
        <div class="col-md-4 col-md-offset-4">
            <form action="." method="GET">{% csrf_token %}
                {{ form|crispy }}

                <input class="btn btn-default" type="button" value="Add to cart" />
            </form>
        </div>
    </div>
<div class='row cart'>
        <div class='col-md-8 col-md-offset-2'>

            <h3>Your cart</h3>

            <table class='table'>
                <thead>
                    <th>Item</th>
                    <th>Price</th>
                    <th>Qty</th>
                    <th>Item Total</th>
                </thead>

                {% for item in cart.cartitem_set.all %}
                    <tr>
                        <td>{{ item.item.sku }}</td>
                        <td>{{ item.item.price }}</td>
                        <td>{{ item.quantity }}</td>
                        <td>{{ item.item_total_price }}</td>
                    </tr>
                {% endfor %}

                <tr id="checkout">
                    <td colspan='4' class='text-right'>Total: {{cart.total}}</td>
                </tr>
                <tr id="checkout">
                    <td colspan='4' class='text-right'><a class='btn btn-warning' href="{% url 'checkout' %}">Checkout</a></td>
                </tr>

            </table>

        </div>
    </div>
</div>

{% endblock %}


Все происходит на одной странице. Есть форма SELECT с продуктами. Я выбираю продукт и нажимаю кнопку. При этом продукт должен появиться в корзине, т.е. в таблице которая ниже под формой.
Но продукт не появляется в таблице сразу при нажатии кнопки, он появляется только после обновления страницы. Как это исправить?
Спасибо!
  • Вопрос задан
  • 1613 просмотров
Подписаться 3 Оценить 7 комментариев
Решения вопроса 1
sim3x
@sim3x
Но продукт не появляется в таблице сразу при нажатии кнопки, он появляется только после обновления страницы. Как это исправить?


Ну так js же никто не сказал, что он должен перерисовать таблицу

$('.btn-default').click(function(e){
        var product = $('select option:selected').val();
        var data = {product: product};
        $.ajax({
            type: 'GET',
            url:'{% url "cart" %}',
            data: data
        })
.success(function (data) {
console.log(data);
// вот тут организуй рендеринг новой корзинки в тело хтмл
$('.table tr').remove();
html = '';
for(var i;i<data.length; i++) {
html += '<tr><td>'+data.sku+ '</td></tr>'
}
$( html ).insertAfter( ".table thead" );
})

;
    });


ps: код может не работать :)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы