我试图添加对象到车,但不添加任何。我是很新,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")
有一些东西,你可以提高你的代码:
1)如果产品不存在(你是“硬线” product_id
是1
,就可能出现这种情况)使用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>
希望检查其中的一个时,编码快乐,你可以找到的错误!
你也可以查看qazxsw POI的搜索项目的出现,据我了解...