AssertionError в / cart / Ожидается `Response`,` HttpResponse` будет возвращен из представления, но получен ` ` - PullRequest
0 голосов
/ 11 января 2020

Я хочу реорганизовать или интегрировать старый код 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 %}

Ответы [ 2 ]

0 голосов
/ 11 января 2020

На самом деле проблема была в

"if request.user.is_authenticated():"

Это будет if request.user.is_authenticated:. Скобка была виновником. Спасибо всем за помощь.

0 голосов
/ 11 января 2020

Вы должны вернуть HTTP-ответ, даже если вы получили исключение. Измените свой get метод следующим образом:

def get(self, request):
    try:
        # rest of your method
        # ... ...
    except Exception as error:
        Response({'success': False}, status=status.HTTP_400_BAD_REQUEST)
...