Я хочу реорганизовать или интегрировать старый код Django из старого проекта Django. Все было в порядке, пока опция добавления в корзину или просмотра. Я не знаю, есть ли что-то, что я пропустил, потому что я просто следую, чтобы кодировать не рабочую процедуру или шаги. Это так просто следовать. Но я получил стек прямо сейчас.
корзина моделей views.py file
from django.shortcuts import render
from django.views.generic.base import TemplateView
from django.shortcuts import redirect
from django.contrib.auth.forms import AuthenticationForm
from django.views.generic.edit import FormMixin
from django.urls import reverse
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from . import models
from products import models as product_models
class CartCreateView(TemplateView, APIView):
""" add item to cart request handler """
template_name = 'carts/view.html'
@staticmethod
def _process_cart(item_id, quantity, delete, request):
cart = None
is_deleted = False
if 'cart_id' not in request.session:
cart = models.Cart.objects.create()
request.session['cart_id'] = cart.id
if cart == None:
cart = models.Cart.objects.get(id=request.session['cart_id'])
if request.user.is_authenticated():
cart.user = request.user
cart.save()
product_models.Variation.objects.get(id=item_id)
cart_item, created = models.CartItem.objects.get_or_create(cart=cart, item_id=item_id)
if created or quantity != 1:
cart_item.quantity = quantity
else:
cart_item.quantity += 1;
if delete in ['y','yes', 'true', 'True']:
is_deleted = True
cart_item.delete()
else:
cart_item.save()
return cart, is_deleted, cart_item
def get(self, request):
try:
item_id = request.GET.get('item')
quantity = request.GET.get('qty', 1)
delete = request.GET.get('delete', 'n')
cart, is_deleted, cart_item = self._process_cart(item_id, int(quantity), delete, request)
cart_count = cart.total_count
request.session['cart_count'] = cart_count
return Response({'success': True,
'deleted': is_deleted,
'count': cart.count,
'item_total': cart_item.item_total,
'cart_price': cart.cart_price,
'cart_count': cart_count}, status=status.HTTP_200_OK)
except Exception as error:
print(error)
class CartDetailView(TemplateView):
template_name = 'carts/view.html'
def get(self, request):
if 'cart_id' not in request.session:
return redirect('/')
cart = models.Cart.objects.get(id=request.session['cart_id'])
return render(request, self.template_name, {'object': cart })
вот мой шаблон, где есть кнопка и некоторая реализация jquery, которая должна работать, когда я нажимаю на кнопка. Но вышеупомянутая ошибка происходит.
Возможно, проблема в использовании APIVIew и django_rest framework. Я еще не знаком с DRF. Пожалуйста, предложите мне, если вы считаете, что желаемый результат может быть достигнут с функциональным представлением или чем-то отличным от этого.
Вот мой шаблон product_page. html
{% extends "base.html" %}
{% block jquery%}
window.onload = function() {
if (window.jQuery) {
// jQuery is loaded
alert("Yeah!");
} else {
// jQuery is not loaded
alert("Doesn't Work");
}
}
function setPrice(){
var price = $('.variation-select option:selected').data('price');
var salePrice = $('.variation-select option:selected').data('sale-price');
if(salePrice && salePrice !== 'None'){
$('#price').html(` <h3>${salePrice}<small style="color:red;text-decoration:line-through;">${price}</small><h3>`);
}
else{
$('#price').text(price);
}
}
$('.variation-select').change(function(){
setPrice();
})
$('#add-to-cart').click(function(event){
event.preventDefault();
var formData = $('#cart-form').serialize();
$.ajax({
url: "{% url 'create_cart' %}" + '?' + formData,
type: 'GET',
success: function(response){
console.log(response);
$('#cart-count-badge').text(response.cart_count);
$('.container.flash-msg').fadeIn();
window.setTimeout(function(){
$('.container.flash-msg').fadeOut();
}, 2000);
},
error: function(response, error){
}
});
});
{% endblock %}
{% block content %}
<style>
.flash-msg {
position: absolute;
top: 23px;
z-index: 2000;
width: 100%;
display: none;
}
</style>
<div class="container flash-msg">
<div class="col-sm-3 col-sm-offset-8">
<div class="alert alert-success" role="alert">
<strong>Item added to cart</strong>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-8">
<h3>{{product.title}}</h3>
{% if product.get_image_url %}
<div>
<img src="{{product.get_image_url}}" class="img-responsive">
</div>
{% endif %}
<div>
<p class="lead">{{product.description}}</p>
</div>
</div>
<div class="col-sm-4">
<form id="cart-form" method="GET" action="{% url 'create_cart' %}">
<!-- show product variation -->
{% if product.variation_set.all.count > 1 %}
<h3 id="price">{{product.variation_set.first.price}}
{% if product.variation_set.first.sale_price %}
<small id="sale-price" style="color:red;text-decoration:line-through;">{{product.variation_set.first.sale_price}}</small>
{% endif %}
</h3>
<select name="item" class="form-control variation-select">
{% for variation in product.variation_set.all %}
<option data-sale-price="{{variation.sale_price}}" data-price="{{variation.price}}" value="{{variation.id}}">{{variation}}</option>
{% endfor %}
</select>
{% else %}
<h3 id="price">{{product.variation_set.first.price}}</h3>
<input type="hidden" name="item" value="{{product.variation_set.first.id}}" />
{% endif %}
<br>
<button id="add-to-cart" class="btn btn-primary" href="">Add To Cart</button>
</form>
<br>
<br>
{% if related_products %}
<h4>Related products</h4>
<div class="row">
{% for product in related_products %}
<div class="col-xs-5">
{% include "products/product_thumbnail.html" with product=product %}
</div>
{% endfor %}
</div>
{% endif %}
</div>
</div>
{% endblock %}