Передавать значения из Django Template for-l oop в представления в Django - PullRequest
0 голосов
/ 13 июля 2020

У меня в базе: enter image description here

Html code for the above image:

{% for crops_ordered_names,crops_ordered_images,crops_ordered_cost,crops_ava in total %}
    
    
         ...  {{crop_ordered_names}}  Доступное количество: {{crodered_ava}}     {{crop_ordered_cost}}          

Как я могу отправить значение количество каждого элемента в django просмотры, чтобы сохранить количество каждого элемента для соответствующего продукта, когда я отправляю форму после ввода всех количеств. Мне нужно получить значение количества из кода HTML:

<input type="number" class="form-control text-center" data-type="quan"  min="1" max="{{crops_ava}}" >

Ответы [ 2 ]

1 голос
/ 28 июля 2020

Я работал над чем-то похожим. И я использовал ajax, чтобы обновить количество. Я не очень хорошо объясняю вещи, но я пытался.

Получить количество уникального предмета, используя id = "amount {{item.id}}

<div style="flex:1">
    <p id="quantity{{ item.id }}" class="align-content-center quantity">{{ item.quantity }}</p>
    <div class="quantity_btns">
        <img height="15" width="15" class="chg-quantity update_cart" data-product="{{ item.id }}" data-action="add" src="{% static  'images/arrow-up.png' %}">
        <img height="15" width="15" class="chg-quantity update_cart" data-product="{{ item.id }}" data-action="remove" src="{% static  'images/arrow-down.png' %}">
    </div>
</div>

И ниже это код ajax.

let update_cart = document.getElementsByClassName('update_cart');

for (var i = 0; i < update_cart.length; i++) {
    update_cart[i].addEventListener('click', function() {
        var data_action = $(this).data('action');

        var product_id = $(this).data('product');
        let quantity = document.getElementById('quantity' + product_id);

        $.ajax({
            url:'/test_add_cart_button',
            data:{
                'data_action':data_action,
                'product_id':product_id,
            },
            success: function(data){

                quantity.innerHTML = data.item_quantity;
            }
        });
    });
}

Небольшое резюме приведенного выше кода. Мы получаем все элементы с классом update_cart. L oop через все элементы. Получить значение атрибута data-action который содержит действие добавления / удаления. Затем получите атрибут data-product (который содержит {{item.id}}). Получите количество продукта, используя getElementById ('amount' + product_id). Где будет извлечен product_id из продукта данных. Затем в ajax мы отправляем значение, которое мы захватили в ключе, чтобы отправить его нашему представлению.

def test_add_cart_button(request):
clicked = request.GET.get('data_action')
product_id = request.GET.get('product_id')
item = CartItem.objects.get(id=product_id, user=request.user)

if clicked == 'add':
    item.quantity += 1
    item.save()

elif clicked == 'remove':
    item.quantity -= 1

    if item.quantity <= 0:
        remove_from_cart(request, item.id)
return JsonResponse({'item_quantity':item.quantity,}, safe=False)

С ключами data_action и product_id. Мы можем использовать их в нашем просмотр по request.GET.get ('data_action') и request.GET.get ('product').

0 голосов
/ 28 июля 2020

это очень похоже на мои проекты. Я думаю, что этот код поможет вам

models.py

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

    def __str__(self):
        return f"{self.item.product_title} No. of quantity : {self.quantity}"

    def get_total_item_price(self):
        return self.quantity * self.item.product_price

    def get_total_discount_item_price(self):
        return self.quantity * self.item.product_discount_price

    def get_amount_saved(self):
        return self.get_total_item_price() - self.get_total_discount_item_price()

    def get_final_price(self):
        if self.item.product_discount_price:
            return self.get_total_discount_item_price()
        return self.get_total_item_price()

views.py

class Cartview(LoginRequiredMixin, View):
    def get(self, *args, **kwargs):
        try:
            order = Order.objects.get(user=self.request.user, ordered=False)
            context = {
                'object': order
            }
            return render(self.request, 'cart.html', context)
        except ObjectDoesNotExist:
            messages.warning(self.request, "You do not have an active order")
            return redirect("/")

Jinja template с для цикла

  <tbody>
                                {% for order_item in object.items.all %}
                                <tr class="text-center">
                                    <td class="product-remove"><span style=color:burlywood; class="badge badge-light">{{forloop.counter}}</span></td>
                                    <td class="image-prod">
                                        <div class="img" style="background-image:url({{order_item.item.product_image.url}});"></div>
                                    </td>

                                    <td class="product-name">
                                        <h3>{{order_item.item.product_title}}</h3>
                                        <p>{{order_item.item.product_description}}</p>
                                    </td>

                                    <td class="price">
                                        {% if order_item.item.product_offer %}
                                        <span class="ml-2 price-sale">&#x20b9; {{order_item.item.product_discount_price}}</span> {% else %}
                                        <span class="price-sale">&#x20b9; {{order_item.item.product_price}}</span> {% endif %}
                                    </td>

                                    <td class="quantity">
                                        <div class="input-group mb-3">
                                            <a href="{% url 'public:remove-single-item-from-cart' order_item.item.product_slug %}" class="minus">-</a>
                                            <input type="text" name="quantity" class="quantity form-control input-number" value="{{ order_item.quantity }}">
                                            <a href="{% url 'public:add-to-cart' order_item.item.product_slug %}" class="plus">+</a>
                                        </div>
                                    </td>

                                    <td class=" total ">
                                        {% if order_item.item.product_offer %} &#x20b9; {{ order_item.get_total_discount_item_price }}
                                        <span class="badge badge-info">Saving &#x20b9; {{ order_item.get_amount_saved }}</span> {% else %} &#x20b9;{{ order_item.get_total_item_price }} {% endif %}
                                    </td>
                                    <td class="product-remove"><a href="{% url 'public:remove-from-cart' order_item.item.product_slug %}"><span class="ion-ios-close"></span></a></td>
                                    {% empty %}
                                    <tr>
                                        <td colspan='6'>Your cart is empty</td>
                                    </tr>
                                </tr>
                                {% endfor %}
                                <!-- END TR-->
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
            <div class="row justify-content-start ">
                <div class="col col-lg-5 col-md-6 mt-5 cart-wrap ftco-animate ">
                    {% if object.get_total %}
                    <div class="cart-total mb-3 ">
                        <h3>Cart Totals</h3>
                        <p class="d-flex ">
                            <span>Subtotal</span>
                            <span>{{object.get_total}}</span>
                        </p>
                        <p class="d-flex ">
                            <span>Delivery</span>
                            <span>0.00</span>
                        </p>
                        <p class="d-flex ">
                            <span>Discount</span>
                            <span>0.00</span>
                        </p>
                        <hr>
                        <p class="d-flex total-price ">
                            <span>Total</span>
                            <span> &#x20b9; {{object.get_total}}</span>
                        </p>
                    </div>
                    {% endif %}

следуйте этому Django документы встроенных функций

...