对象未保存到django的购物车中

时间:2019-02-05 01:42:53

标签: python django e-commerce

我正在尝试将对象添加到购物车,但未添加任何内容。我是Django的新手,不胜感激。我也认为错误与我的cart_update函数有关。在本教程中,这就是我的写作方式,但是当我查找此问题时,发现我应该使用get_object_or_404。当我尝试这种方式时,我仍然无法在购物车中添加对象。

models.py

p1

在此视图中是发生问题的我的cart_update函数。

购物车/views.py

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)

2 个答案:

答案 0 :(得分:1)

据我所知,您还可以检查symfony/process是否出现搜索到的项目...

答案 1 :(得分:0)

您可以在代码中进行一些改进:

1)如果不存在该产品(您可能是product_id的“硬接线” 1,则可能是这种情况)使用logging,则有{{1} }语句是不够的。

2)如果产品已经在购物车中,则将其删除,使购物车为空。您也许可以增加数量?

3)条件print将始终为if product_id in cart_obj.products.all() False将返回cart_obj.products.all()而不是id值的查询集,那里有两个选项:

Product

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

4)我没有看到您的if product_obj in cart_obj.products.all() 模板,但是在您的视图'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}) 

希望您能在检查其中一种愉快的编码时发现错误!