Как удалить выбранный элемент корзины с помощью платформы Django rest?

#python #django #django-rest-framework #django-views #django-templates

Вопрос:

Я использую Django в качестве бэкенда, PostgresSQL в качестве БД и HTML, CSS и Javascript в качестве интерфейса

Я вызываю API Django с помощью Javascript, чтобы показать товар корзины аутентифицированному user

serializer.py

 from .models import *
from rest_framework import serializers

class productserializers(serializers.ModelSerializer):
    class Meta:
        model = Cart
        fields = '__all__'
        depth = 1
 

views.py

 @api_view(['GET'])
def showproduct(request):
    if request.method == 'GET':
        result = Cart.objects.filter(user = request.user)
        serialize = productserializers(result, many = True)
        return Response(serialize.data)
 

main.js

 $(document).ready(function() {
    $.ajax({
      url: 'http://127.0.0.1:8000/showdata',
      dataType: 'JSON',
      success: function(data){
        for (var i = 0; i < data.length; i  )
        {
          var row = 
          $('<tr><td style="font-style:bold">'
           data[i].product.name '</td><td style="font-style:bold">'
           data[i].product.price '</td><td><a href='
           data[i].product.link_href '><button type="button" class="btn btn-outline-success">Buy</button></a></td><td><a href='#'><button type="button" class="btn btn-outline-danger">DELETE</button></a></td></tr>');
          $("#tableProduct").append(row);
        }
      }
    });
});
 

Ну, а сверху код на main.js

 ...
<td><a href='#'><button type="button" class="btn btn-outline-danger">DELETE</button></a></td>
...
 

В этой строке я хочу реализовать функцию удаления. Где пользователь может удалить выбранный товар из корзины. Итак, как реализовать функцию удаления, которая может удалить товар из корзины и показать ответ в шаблоне.

Вот как я добавляю элемент корзины в АДМИНИСТРИРОВАНИЕ DJANGO.

view.py

 def addProduct(request):
    user = request.user
    product_id = request.GET.get('product_id')
    product_cart = Product.objects.get(id=product_id)
    Cart(user=user, product=product_cart).save()
    return render(request, 'cart/addtocart.html')
 

ПРАВКА 1

 <script>
  $(document).ready(function() {
    $.ajax({
      url: 'http://127.0.0.1:8000/showdata ',
      dataType: 'JSON',
      success: function(data){
        for (var i = 0; i < data.length; i  )
        {
          var row = 
          $('<tr><td style="font-style:bold">'
           data[i].product.name '</td><td style="font-style:bold">'
           data[i].product.price '</td><td><a href='
           data[i].product.link_href '><button type="button" class="btn btn-outline-success">Buy</button></a></td><td><button onclick="destoryCart(' data[i].product.id ')" type="button" class="btn btn-outline-danger">DELETE</button></td></tr>');
          $("#tablebuild").append(row);
        }
     
      }
    });
});

const destoryCart = (id) => {
  let url = `{% url 'main:cart_destroy' ${id} %}`
  $.ajax({
      beforeSend: function(xhr){xhr.setRequestHeader('X-CSRFToken', '{{ csrf_token }}');},
      url: url,
      type: 'DELETE',
      success: (data) => {
          console.log("deleted!")
      },
      error: (err) => {
          console.log(err);
      }
  });
} 
</script>  
 

urls.py

 path('cart_destroy/', views.CartDestroyAPIView.as_view(), name ='cart_destroy'),
 

views.py

 class CartDestroyAPIView(DestroyAPIView): # DeleteView
    permission_classes = [IsAuthenticated] # Or anything else you want
    authentication_classes = [SessionAuthentication]  # Or anything else you want
    serializer_class = productserializers
    queryset = Cart.objects.all() 
 

Ответ №1:

Вот как вы можете удалить свои карты:

 class CartDestroyAPIView(DestroyAPIView): # DeleteView
"""
Cart Destroy API View
"""
permission_classes = [IsAuthenticated] # Or anything else you want
authentication_classes = [SessionAuthentication]  # Or anything else you want
serializer_class = productserializers
queryset = Cart.objects.all()   
 

А для части JS вы можете создать функцию, которая получает идентификатор и отправляет запрос на удаление в вашу CartDestroyAPIView конечную точку:

 const destoryCart = (id) => {

    let url = `your end point/${id}`; 


    $.ajax({
        beforeSend: function(xhr){xhr.setRequestHeader('X-CSRFToken', '{{ csrf_token }}');},
        url: url,
        type: 'DELETE',
        success: (data) => {
            console.log("deleted!")
        },
        error: (err) => {
            console.log(err);
        }
    });

}  
 

Теперь, когда вы создаете списки своих корзин success во время вызова ajax, вы можете сделать это с помощью кнопки удалить:

 `<td>
     <button onclick="destoryCart(${cart.id})" type="button" class="btn btn-outline-danger">
        DELETE
     </button>
 </td>`   
 

в вашем случае будет так:

 $(document).ready(function() {
$.ajax({
  url: 'http://127.0.0.1:8000/showdata',
  dataType: 'JSON',
  success: function(data){
    for (var i = 0; i < data.length; i  )
    {
      var row = 
      $('<tr><td style="font-style:bold">'
       data[i].product.name '</td><td style="font-style:bold">'
       data[i].product.price '</td><td><a href='
       data[i].product.link_href '><button type="button" class="btn btn-outline-success">Buy</button></a></td><td><button onclick="destoryCart(' data[i].product.id ')" type="button" class="btn btn-outline-danger">DELETE</button></td></tr>');
      $("#tableProduct").append(row);
    }
  }
});
 

});

если вы пишете свой js внутри файла .js, вы не можете получить csrf_token это, вместо этого вы можете сделать это.
Совет:
вы отступаете (`), когда хотите использовать свою переменную внутри строки в js

 let name = "John";
console.log(`My name is ${name}`);
 

Комментарии:

1. Как это реализовать в AJAX ? Кнопку удаления, о которой я упоминал, я хочу реализовать там. Как это может произойти?

2. Было ли это полезно, скажите мне, если вы получите ошибки @santoshChauhan

3. Я думаю, что я должен этот файл JS в HTML, это будет лучше. И я дам вам знать как можно скорее

4. вы также можете получить свой csrf-токен в своем файле js, проверьте ссылку, которую я поставил, это документация по fron django, просто скопируйте функцию и вы можете ее использовать

5. Здравствуйте, сэр, Как будет выглядеть URL-адрес: path('cart_destroy/', views.CartDestroyAPIView.as_view(), name ='cart_destroy'), при реализации этого я получаю ошибку как Could not parse the remainder: '${id}' from '${id}'

Ответ №2:

 def delete_cart_item(request):
    cart_item_id = request.GET.get('cart_item_id')
    CartItem.objects.filter(cart__user=rquest.user.id,id=cart_item_id)
    return render(request, your template)