Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django error:ValueError位于/cart/->;精确查找的QuerySet值必须限制为使用切片的一个结果_Python_Django - Fatal编程技术网

Python Django error:ValueError位于/cart/->;精确查找的QuerySet值必须限制为使用切片的一个结果

Python Django error:ValueError位于/cart/->;精确查找的QuerySet值必须限制为使用切片的一个结果,python,django,Python,Django,将书籍添加到购物车时,我遇到一个值错误。它指向订单的views.py中的for循环。我想不出解决的办法。感谢您的帮助 书店django/store/views.py”,第68行,在购物车中 对于订单中的订单: 异常类型:ValueError位于/cart/ 异常值:精确查找的QuerySet值必须限制为使用切片的一个结果 型号.py from django.db import models from django.db.models.query import prefetch_related_o

将书籍添加到购物车时,我遇到一个值错误。它指向订单的views.py中的for循环。我想不出解决的办法。感谢您的帮助

书店django/store/views.py”,第68行,在购物车中 对于订单中的订单:

异常类型:ValueError位于/cart/

异常值:精确查找的QuerySet值必须限制为使用切片的一个结果

型号.py

from django.db import models
from django.db.models.query import prefetch_related_objects
from django.utils import timezone
from django.contrib.auth.models import User

class Author(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    def __str__(self):
        return "%s, %s" % (self.last_name, self.first_name)


class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, null=True, blank=True)
    description = models.TextField()
    publish_date = models.DateField(default=timezone.now)
    price = models.DecimalField(decimal_places=2, max_digits=8)
    stock = models.IntegerField(default=2)

    class Meta:
        verbose_name ='Book'
        verbose_name_plural = 'Books'
        db_table = 'book' #default is store_book


class Review(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    publish_date = models.DateField(default=timezone.now)
    text = models.TextField()


class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    active = models.BooleanField(default=True)
    order_date = models.DateField(null=True)
    payment_type = models.CharField(max_length=100, null=True)
    payment_id = models.CharField(max_length=100, null=True)

    def add_to_cart(self, book_id):
        book = Book.objects.get(pk=book_id)
        try:
            preexisting_order = BookOrder.objects.get(book=book, cart=self)
            preexisting_order.quantity += 1
            preexisting_order.save()
        except BookOrder.DoesNotExist:
            new_order = BookOrder.objects.create(
                book=book, 
                cart=self,
                quantity = 1
            )
            new_order.save

    def remove_from_cart(self, book_id):
        book = Book.objects.get(pk=book_id)
        try:
            preexisting_order = BookOrder.objects.get(book=book, cart=self)
            if preexisting_order.quantity > 1:
                preexisting_order.quantity -= 1
                preexisting_order.save()
            else: 
                preexisting_order.delete()
        except BookOrder.DoesNotExist:
            pass


class BookOrder(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
    quantity = models.IntegerField()
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import redirect, render
from .models import Book, BookOrder, Cart
def index(request):

    context = {

    }
    return render(request, 'template.html', context)

def store(request):
    books = Book.objects.all()

    context = {
        'books': books,
    }

    return render(request, 'base.html', context)

def book_details(request, book_id):

    context = {
        'book': Book.objects.get(pk=book_id),
    }
    
    return render(request, 'store/detail.html', context)


def add_to_cart(request, book_id):
    if request.user.is_authenticated:
        try: 
            book = Book.objects.get(pk=book_id)
        except ObjectDoesNotExist:
            pass
        else:
            try:
                cart = Cart.objects.get(user=request.user, active=True)
            except ObjectDoesNotExist:
                cart = Cart.objects.create(
                    user=request.user
                )
                cart.save()
            cart.add_to_cart(book_id)
        return redirect('store:cart')
    else:
        return redirect('index')


def remove_from_cart(request, book_id):
    if request.user.is_authenticated:
        try:
            book = Book.objects.get(pk=book_id)
        except ObjectDoesNotExist:
            pass
        else:
            cart = Cart.objects.get(user=request.user, active=True)
            cart.remove_from_cart(book_id)
        return redirect('cart')
    else:
        return redirect('index')

def cart(request):
    if request.user.is_authenticated:
        cart = Cart.objects.filter(user=request.user.id, active=True)
        orders = BookOrder.objects.filter(cart=cart)
        total = 0
        count = 0
        
        for order in orders:
            total += (order.book.price * order.quantity)
            count += order.quantity
        
        context = {
            'cart': orders, 
            'total': total,
            'count': count,
        }
        return render(request, 'store/cart.html', context)
    else:
        return redirect('index')
from django.urls import path
from . import views

app_name = 'store'

urlpatterns = [
    path('', views.index, name='index' ), 
    path('store/', views.store, name='store' ), 
    path('store/<int:book_id>', views.book_details, name='book_details'), 
    path('add/<int:book_id>', views.add_to_cart, name='add_to_cart'),    
    path('remove/<int:book_id>', views.remove_from_cart, name='remove_from_cart'), 
    path('cart/', views.cart, name='cart'),
]
视图.py

from django.db import models
from django.db.models.query import prefetch_related_objects
from django.utils import timezone
from django.contrib.auth.models import User

class Author(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    def __str__(self):
        return "%s, %s" % (self.last_name, self.first_name)


class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, null=True, blank=True)
    description = models.TextField()
    publish_date = models.DateField(default=timezone.now)
    price = models.DecimalField(decimal_places=2, max_digits=8)
    stock = models.IntegerField(default=2)

    class Meta:
        verbose_name ='Book'
        verbose_name_plural = 'Books'
        db_table = 'book' #default is store_book


class Review(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    publish_date = models.DateField(default=timezone.now)
    text = models.TextField()


class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    active = models.BooleanField(default=True)
    order_date = models.DateField(null=True)
    payment_type = models.CharField(max_length=100, null=True)
    payment_id = models.CharField(max_length=100, null=True)

    def add_to_cart(self, book_id):
        book = Book.objects.get(pk=book_id)
        try:
            preexisting_order = BookOrder.objects.get(book=book, cart=self)
            preexisting_order.quantity += 1
            preexisting_order.save()
        except BookOrder.DoesNotExist:
            new_order = BookOrder.objects.create(
                book=book, 
                cart=self,
                quantity = 1
            )
            new_order.save

    def remove_from_cart(self, book_id):
        book = Book.objects.get(pk=book_id)
        try:
            preexisting_order = BookOrder.objects.get(book=book, cart=self)
            if preexisting_order.quantity > 1:
                preexisting_order.quantity -= 1
                preexisting_order.save()
            else: 
                preexisting_order.delete()
        except BookOrder.DoesNotExist:
            pass


class BookOrder(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
    quantity = models.IntegerField()
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import redirect, render
from .models import Book, BookOrder, Cart
def index(request):

    context = {

    }
    return render(request, 'template.html', context)

def store(request):
    books = Book.objects.all()

    context = {
        'books': books,
    }

    return render(request, 'base.html', context)

def book_details(request, book_id):

    context = {
        'book': Book.objects.get(pk=book_id),
    }
    
    return render(request, 'store/detail.html', context)


def add_to_cart(request, book_id):
    if request.user.is_authenticated:
        try: 
            book = Book.objects.get(pk=book_id)
        except ObjectDoesNotExist:
            pass
        else:
            try:
                cart = Cart.objects.get(user=request.user, active=True)
            except ObjectDoesNotExist:
                cart = Cart.objects.create(
                    user=request.user
                )
                cart.save()
            cart.add_to_cart(book_id)
        return redirect('store:cart')
    else:
        return redirect('index')


def remove_from_cart(request, book_id):
    if request.user.is_authenticated:
        try:
            book = Book.objects.get(pk=book_id)
        except ObjectDoesNotExist:
            pass
        else:
            cart = Cart.objects.get(user=request.user, active=True)
            cart.remove_from_cart(book_id)
        return redirect('cart')
    else:
        return redirect('index')

def cart(request):
    if request.user.is_authenticated:
        cart = Cart.objects.filter(user=request.user.id, active=True)
        orders = BookOrder.objects.filter(cart=cart)
        total = 0
        count = 0
        
        for order in orders:
            total += (order.book.price * order.quantity)
            count += order.quantity
        
        context = {
            'cart': orders, 
            'total': total,
            'count': count,
        }
        return render(request, 'store/cart.html', context)
    else:
        return redirect('index')
from django.urls import path
from . import views

app_name = 'store'

urlpatterns = [
    path('', views.index, name='index' ), 
    path('store/', views.store, name='store' ), 
    path('store/<int:book_id>', views.book_details, name='book_details'), 
    path('add/<int:book_id>', views.add_to_cart, name='add_to_cart'),    
    path('remove/<int:book_id>', views.remove_from_cart, name='remove_from_cart'), 
    path('cart/', views.cart, name='cart'),
]
url.py

from django.db import models
from django.db.models.query import prefetch_related_objects
from django.utils import timezone
from django.contrib.auth.models import User

class Author(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    def __str__(self):
        return "%s, %s" % (self.last_name, self.first_name)


class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, null=True, blank=True)
    description = models.TextField()
    publish_date = models.DateField(default=timezone.now)
    price = models.DecimalField(decimal_places=2, max_digits=8)
    stock = models.IntegerField(default=2)

    class Meta:
        verbose_name ='Book'
        verbose_name_plural = 'Books'
        db_table = 'book' #default is store_book


class Review(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    publish_date = models.DateField(default=timezone.now)
    text = models.TextField()


class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    active = models.BooleanField(default=True)
    order_date = models.DateField(null=True)
    payment_type = models.CharField(max_length=100, null=True)
    payment_id = models.CharField(max_length=100, null=True)

    def add_to_cart(self, book_id):
        book = Book.objects.get(pk=book_id)
        try:
            preexisting_order = BookOrder.objects.get(book=book, cart=self)
            preexisting_order.quantity += 1
            preexisting_order.save()
        except BookOrder.DoesNotExist:
            new_order = BookOrder.objects.create(
                book=book, 
                cart=self,
                quantity = 1
            )
            new_order.save

    def remove_from_cart(self, book_id):
        book = Book.objects.get(pk=book_id)
        try:
            preexisting_order = BookOrder.objects.get(book=book, cart=self)
            if preexisting_order.quantity > 1:
                preexisting_order.quantity -= 1
                preexisting_order.save()
            else: 
                preexisting_order.delete()
        except BookOrder.DoesNotExist:
            pass


class BookOrder(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
    quantity = models.IntegerField()
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import redirect, render
from .models import Book, BookOrder, Cart
def index(request):

    context = {

    }
    return render(request, 'template.html', context)

def store(request):
    books = Book.objects.all()

    context = {
        'books': books,
    }

    return render(request, 'base.html', context)

def book_details(request, book_id):

    context = {
        'book': Book.objects.get(pk=book_id),
    }
    
    return render(request, 'store/detail.html', context)


def add_to_cart(request, book_id):
    if request.user.is_authenticated:
        try: 
            book = Book.objects.get(pk=book_id)
        except ObjectDoesNotExist:
            pass
        else:
            try:
                cart = Cart.objects.get(user=request.user, active=True)
            except ObjectDoesNotExist:
                cart = Cart.objects.create(
                    user=request.user
                )
                cart.save()
            cart.add_to_cart(book_id)
        return redirect('store:cart')
    else:
        return redirect('index')


def remove_from_cart(request, book_id):
    if request.user.is_authenticated:
        try:
            book = Book.objects.get(pk=book_id)
        except ObjectDoesNotExist:
            pass
        else:
            cart = Cart.objects.get(user=request.user, active=True)
            cart.remove_from_cart(book_id)
        return redirect('cart')
    else:
        return redirect('index')

def cart(request):
    if request.user.is_authenticated:
        cart = Cart.objects.filter(user=request.user.id, active=True)
        orders = BookOrder.objects.filter(cart=cart)
        total = 0
        count = 0
        
        for order in orders:
            total += (order.book.price * order.quantity)
            count += order.quantity
        
        context = {
            'cart': orders, 
            'total': total,
            'count': count,
        }
        return render(request, 'store/cart.html', context)
    else:
        return redirect('index')
from django.urls import path
from . import views

app_name = 'store'

urlpatterns = [
    path('', views.index, name='index' ), 
    path('store/', views.store, name='store' ), 
    path('store/<int:book_id>', views.book_details, name='book_details'), 
    path('add/<int:book_id>', views.add_to_cart, name='add_to_cart'),    
    path('remove/<int:book_id>', views.remove_from_cart, name='remove_from_cart'), 
    path('cart/', views.cart, name='cart'),
]
从django.url导入路径
从。导入视图
应用程序名称='商店'
URL模式=[
路径(“”,views.index,name='index'),
路径('store/',views.store,name='store'),
路径('store/',views.book\u details,name='book\u details'),
路径('add/',views.add_to_cart,name='add_to_cart'),
路径('remove/',views.remove_from_cart,name='remove_from_cart'),
路径('cart/',views.cart,name='cart'),
]
cart.html

{% block body %}
<div class="col-md-8 col-md-offset-2 col-sm-12 maincontent col-center">
    <div style="text-align:center;text-decoration:underline"><h3>Your Cart</h3></div>
        <div class="cart_container">
        {% for item in cart %}
            <div class="cart_item">
                <div class="cart_listing">
                    <span class="title">{{ item.book.title }}</span> by {{ item.book.author.first_name }} {{ item.book.author.last_name }}
                </div>
                <div class="cart_price">
                    <span class="cart_quantity">{{ item.quantity }} x $ <span class="cart_value">{{ item.book.price }}</span></span>

                    Quantity: <a href="{% url 'store:add_to_cart' book.id %}">[+]</a> / 
                    <a href="{ url 'store:remove_from_cart' item.book.id %}">[-]</a>
                </div>
            </div>
        {% empty %}
            <div>
            There are no items in your cart.
            </div>
        {% endfor %}
        <div class="cart_total">
             <h4> Total: $<span class="cart_value">{{ total }}</span></h4>
        </div>
        </div>
    </div>
</div>
{% endblock %}
{% block body %}
                <div class="col-md-8 col-md-offset-2 col-sm-12 maincontent col-center" > 

                    <div style="text-align:center"><h3>Welcome to our store!</h3></div>

                    {% for book in books%}

                    <div class="storefront_book_display">
                    <a href="{% url 'store:book_details' book.id %}">
                            <img src="{% static 'base/img/empty_cover.jpg' %}">
                            <span class="storefront_book_title">{{ book.title }}</span>
                            <span class="storefront_book_author">{{ book.author }}</span>
                            </a>
                            <span class="storefront_add_to_cart">
                                <a href="{% url 'store:add_to_cart' book.id %}">Add to cart</a>
                            </span>
                    </div>
                    {% endfor %}                
                </div>
{% endblock %} 
{%block body%}
你的车
{购物车%中的商品为%1}
{{item.book.title}}{{item.book.author.first_name}{{item.book.author.last_name}}
{{item.quantity}}x${{{item.book.price}
数量:/
{%empty%}
您的购物车中没有商品。
{%endfor%}
总计:${{Total}
{%endblock%}
base.html

{% block body %}
<div class="col-md-8 col-md-offset-2 col-sm-12 maincontent col-center">
    <div style="text-align:center;text-decoration:underline"><h3>Your Cart</h3></div>
        <div class="cart_container">
        {% for item in cart %}
            <div class="cart_item">
                <div class="cart_listing">
                    <span class="title">{{ item.book.title }}</span> by {{ item.book.author.first_name }} {{ item.book.author.last_name }}
                </div>
                <div class="cart_price">
                    <span class="cart_quantity">{{ item.quantity }} x $ <span class="cart_value">{{ item.book.price }}</span></span>

                    Quantity: <a href="{% url 'store:add_to_cart' book.id %}">[+]</a> / 
                    <a href="{ url 'store:remove_from_cart' item.book.id %}">[-]</a>
                </div>
            </div>
        {% empty %}
            <div>
            There are no items in your cart.
            </div>
        {% endfor %}
        <div class="cart_total">
             <h4> Total: $<span class="cart_value">{{ total }}</span></h4>
        </div>
        </div>
    </div>
</div>
{% endblock %}
{% block body %}
                <div class="col-md-8 col-md-offset-2 col-sm-12 maincontent col-center" > 

                    <div style="text-align:center"><h3>Welcome to our store!</h3></div>

                    {% for book in books%}

                    <div class="storefront_book_display">
                    <a href="{% url 'store:book_details' book.id %}">
                            <img src="{% static 'base/img/empty_cover.jpg' %}">
                            <span class="storefront_book_title">{{ book.title }}</span>
                            <span class="storefront_book_author">{{ book.author }}</span>
                            </a>
                            <span class="storefront_add_to_cart">
                                <a href="{% url 'store:add_to_cart' book.id %}">Add to cart</a>
                            </span>
                    </div>
                    {% endfor %}                
                </div>
{% endblock %} 
{%block body%}
欢迎光临本店!
{书籍中书籍的百分比%}
{%endfor%}
{%endblock%}
您的问题在于:

cart = Cart.objects.filter(user=request.user.id, active=True) # this is a queryset
orders = BookOrder.objects.filter(cart=cart) # this is the exact lookup mentioned
cart
在这里是一个查询集,而不是一个实例。如果您只希望使用一个可能的cart,请使用
。获取
。如果可能有多个结果,请像现在一样使用筛选器,但在订单查询中使用
\u in

将其更改为:

cart = Cart.objects.get(user=request.user.id, active=True)
orders = BookOrder.objects.filter(cart=cart)