对象不保存到购物车中的Django

问题描述 投票:1回答:2

我试图添加对象到车,但不添加任何。我是很新,Django的任何帮助表示赞赏。此外,我认为错误与我cart_update函数来完成。在本教程中我这是怎么写的,但是当我在寻找了这个问题,我发现我应该使用get_object_or_404。当我试图这样,我仍然不成功对象添加到购物车。

models.朋友

from django.db import models
import os
import random
from django.db.models import Q
from django.db.models.signals import pre_save, post_save
from django.urls import reverse 
from django.shortcuts import get_object_or_404

from .utils import unique_slug_generator

def get_filename_ext(filepath):
    base_name = os.path.basename(filepath)
    name, ext = os.path.splitext(base_name)
    return name, ext

def upload_image_path(instance, filename):
    new_filename = random.randint(1,233434234)
    name, ext = get_filename_ext(filename)
    final_filename = '{new_filename}{ext}'.format(new_filename=new_filename, ext=ext)
    return "products/{new_filename}/{final_filename}".format(new_filename=new_filename, final_filename=final_filename)


class ProductQuerySet(models.query.QuerySet):
    def active(self):
        return self.filter(active=True)

    def featured(self):
        return self.filter(featured=True, active=True)

    def search(self,query):
        lookups = (Q(title__icontains=query) | 
                   Q(description__icontains=query) |
                   Q(price__icontains=query) |
                   Q(tag__title__icontains=query)
                    )
        return self.filter(lookups).distinct()

class ProductManager(models.Manager):
    def get_queryset(self):
        return ProductQuerySet(self.model, using=self._db)

    def all(self):
        return self.get_queryset().active()

    def featured(self):
        return self.get_queryset().featured()

    def get_by_id(self,id):
        qs = self.get.queryset().filter(id=id)
        if qs.count() == 1:
            return qs.first()
        return None

    def search(self,query):
        return self.get_queryset().active().search(query)

class Product(models.Model):
    title           = models.CharField(max_length=120)
    slug            = models.SlugField(blank=True,unique=True)
    description     = models.TextField()
    price           = models.DecimalField(decimal_places=2,max_digits=20,default=10.99)
    image           = models.ImageField(upload_to='gallery',null=True,blank=True)
    featured        = models.BooleanField(default=False)
    active          = models.BooleanField(default=True)
    timestamp       = models.DateTimeField(auto_now_add=True)

    objects = ProductManager()

    def get_absolute_url(self):
#        return "/products/{slug}/".format(slug=self.slug)
         return reverse("products:detail", kwargs={"slug": self.slug})

    def __str__(self):
        return self.title

def product_pre_save_receiver(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = unique_slug_generator(instance)

pre_save.connect(product_pre_save_receiver, sender=Product)

在这种观点是我cart_update函数,其中的问题发生。

车/ views.py

    from django.shortcuts import render, redirect, get_object_or_404
from products.models import Product
from .models import Cart


def cart_home(request):
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    products = cart_obj.products.all()

    return render(request, 'carts/home.html', {})

def cart_update(request):
    product_id = 1 #request.POST.get('product_id')
#    print(Product.objects.get(id=1))
    if product_id is not None:
        try:
            product_obj = Product.objects.get(id=product_id)
        except Product.DoesNotExist:
            print("show message to user ,Product is gone")
            return redirect("cart:home")
        cart_obj, new_obj = Cart.objects.new_or_get(request)
        if product_id in cart_obj.products.all():
            cart_obj.products.remove(product_obj)
        else:    
            cart_obj.products.add(product_obj)
    #    return redirect(product_obj.get_absolute_url())
    return redirect("cart:home")
python django e-commerce
2个回答
0
投票

有一些东西,你可以提高你的代码:

1)如果产品不存在(你是“硬线” product_id1,就可能出现这种情况)使用logging,在有些情况print声明是不够的。

2)如果产品已经在购物车中,你删除它离开车空。也许你可以增加量是多少?

3)条件if product_id in cart_obj.products.all()永远是False cart_obj.products.all()将返回的查询集为Product不是ID值,有两个选项有:

if product_id in cart_obj.products.values_list("id", flat=True)

要么

if product_obj in cart_obj.products.all()

4)我从来没见过你'carts/home.html'模板,但在你看来cart_home,你不增加产品的视图上下文和,顺便说一下,因为你可以在篮子中访问产品通过了篮筐本身(它们是相关的) ,你不需要行products = cart_obj.products.all()。就在cart_obj添加到视图上下文

def cart_home(request):
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    return render(request, 'carts/home.html', {"cart": cart_obj}) 

写类似下面的模板代码:

<ul>
{% for product in cart.products.all %}
    <li>{{ product.title }}</li>
{% endfor %}
</ul>

希望检查其中的一个时,编码快乐,你可以找到的错误!


1
投票

你也可以查看qazxsw POI的搜索项目的出现,据我了解...

© www.soinside.com 2019 - 2024. All rights reserved.