Использование методов http с платформой отдыха djangoPython

Программы на Python
Anonymous
Использование методов http с платформой отдыха django

Сообщение Anonymous »

Мне нужен совет о том, как правильно использовать созданный мной API DRF, в частности, метод PATCH в настоящее время. Я пытаюсь создать сценарий для исправления количества товара/элемента корзины, который был успешно добавлен в корзину, но я не могу заставить его работать.
В контексте моего проекта: Моя цель в сценариях - создать корзину, использовать кнопку для добавления товара или удаления товара (количество -1). Как только клиент нажимает кнопку перехода к оплате, товары корзины затем передаются в заказ. модель Итак, я могу обработать заказ. Как только статус заказа будет завершен, корзина будет удалена и создана заново.
Вот мой текущий скрипт:
const updateBtns = document.querySelectorAll(".update-cart");
const user = "{{request.user}}";
for (let i = 0; i < updateBtns.length; i++) {
updateBtns.addEventListener("click", function () {
event.preventDefault(); // prevent page from refreshing
const productId = this.dataset.product;
const action = this.dataset.action;
console.log("productId:", productId, "action:", action);
console.log("USER:", user);
createCart(productId, action);
});
}
function createCart(productId, action, cartId) {
var csrftoken = getCookie("csrftoken");
console.log("User is logged in, sending data...");
fetch("/get_cart_id/")
.then((response) => response.json())
.then((data) => {
const cartId = data.cart_id;
console.log("Cart ID:", cartId); // log cartId in console

let method, url;
if (action === "add") {
method = "POST";
url = `/api/carts/${cartId}/items/`;
} else if (action === "remove") {
method = "PATCH";

url = `/api/carts/${cartId}/items/${THIS_IS_WHERE_I_NEED_ITEM_ID}/`;
} else {
console.log(`Invalid action: ${action}`);
return;
}

fetch(url, {
method: method,
headers: {
"Content-Type": "application/json",
"X-CSRFToken": csrftoken,
},
body: JSON.stringify({
product_id: productId,
quantity: 1,
}),
})
.then((response) => response.json())
.then((data) => {
console.log(`Item ${action}ed in cart:`, data);
});
});
}

Вот мои сериализаторы, относящиеся к моей корзине (пожалуйста, спросите меня, если вам нужна дополнительная информация, чтобы помочь мне):
class CartItemSerializer(serializers.ModelSerializer):
product = SimpleProductSerializer()
total_price = serializers.SerializerMethodField()

def get_total_price(self, cart_item:CartItem):
return cart_item.quantity * cart_item.product.price

class Meta:
model = CartItem
fields = ['id', 'product', 'quantity', 'total_price']

CartSerializer(serializers.ModelSerializer):
id = serializers.UUIDField(read_only=True)
items = CartItemSerializer(many=True, read_only=True)
total_price = serializers.SerializerMethodField()

def get_total_price(self, cart):
return sum([item.quantity * item.product.price for item in cart.items.all()])

class Meta:
model = Cart
fields = ['id', 'items', 'total_price']

class AddCartItemSerializer(serializers.ModelSerializer):
product_id = serializers.IntegerField()

def validate_product_id(self, value):
if not Product.objects.filter(pk=value).exists():
raise serializers.ValidationError('No product with the given ID was found.')
return value

def save(self, **kwargs):
cart_id = self.context['cart_id']
product_id = self.validated_data['product_id']
quantity = self.validated_data['quantity']

try:
cart_item = CartItem.objects.get(cart_id=cart_id, product_id=product_id)
cart_item.quantity += quantity
cart_item.save()
self.instance = cart_item
except CartItem.DoesNotExist:
self.instance = CartItem.objects.create(cart_id=cart_id, **self.validated_data)

return self.instance

class Meta:
model = CartItem
fields = ['id', 'product_id', 'quantity']

class UpdateCartItemSerializer(serializers.ModelSerializer):
class Meta:
model = CartItem
fields = ['quantity']

Наконец, вот мои наборы представлений:
class CartViewSet(CreateModelMixin,
RetrieveModelMixin,
DestroyModelMixin,
GenericViewSet):
queryset = Cart.objects.prefetch_related('items__product').all()
serializer_class = CartSerializer

class CartItemViewSet(ModelViewSet):
http_method_names = ['get', 'post', 'patch', 'delete']

def get_serializer_class(self):
if self.request.method == 'POST':
return AddCartItemSerializer
elif self.request.method == 'PATCH':
return UpdateCartItemSerializer
return CartItemSerializer

def get_serializer_context(self):
return {'cart_id': self.kwargs['cart_pk']}

def get_queryset(self):
return CartItem.objects \
.filter(cart_id=self.kwargs['cart_pk']) \
.select_related('product')

Это мое представление, которое я создал для получения корзины, связанной с текущим пользователем, которая создается, когда он заходит на домашнюю страницу/галерею/страницу продукта:
def get_cart_id(request):
if request.user.is_authenticated:
cart = Cart.objects.get(user=request.user)
cart_id = cart.id
return JsonResponse({'cart_id': cart_id})
else:
return JsonResponse({'error': 'User is not authenticated'})


Подробнее здесь: https://stackoverflow.com/questions/760 ... -framework

Вернуться в «Python»