我犯了这个错误,不知道为什么会这样
ValueError at /add_to_cart/printed-shirt/
Field 'id' expected a number but got 'Green'.
我想给我的产品增加一些变化。因此,当我提交时,我打印用户通过写入print(request.POST.getlist('variations', []))
选择的值,这些值返回为['Red', 'Medium']
。
现在,我想看看购物车中是否已经存在与这些变化相匹配的产品。如果它存在,那么我会增加数量,如果它不存在,那么我会添加一个新项目。该错误正在线路上抛出
order_item_qs = order_item_qs.filter(
但我的代码似乎不起作用。有人能帮我吗?提前谢谢
My views.py:
@login_required
def add_to_cart(request, slug):
item = get_object_or_404(Item, slug=slug)
variations = request.POST.getlist('variations', [])
print(variations)
minimum_variation_count = Variation.objects.filter(item=item).count()
if len(variations) < minimum_variation_count:
messages.info(request, "Please specify the required variations.")
order_item_qs = OrderItem.objects.filter(
item=item,
user= request.user,
ordered=False,
)
for v in variations:
order_item_qs = order_item_qs.filter(
item_variations__exact=v
)
if order_item_qs.exists():
order_item = order_item_qs.first()
order_item.quantity += 1
order_item.save()
else:
order_item = OrderItem.objects.create(
item=item,
user= request.user,
ordered=False,
)
order_item.item_variations.add(*variations)
order_item.save()
order_qs = Order.objects.filter(user=request.user, ordered=False)
if order_qs.exists():
order = order_qs[0]
if not order.items.filter(item__id=order_item.id).exists():
order.items.add(order_item)
messages.success(request, "Product added to cart.")
return redirect("order-summary")
else:
ordered_date = timezone.now()
order = Order.objects.create(user=request.user, ordered_date=ordered_date)
order.items.add(order_item)
messages.success(request, "Product added to cart.")
return redirect("order-summary")
return redirect("order-summary")
My models.py:
class Item(models.Model):
title = models.CharField(max_length=120)
price = models.FloatField()
class Variation(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
name = models.CharField(max_length=50) # size, color
class ItemVariation(models.Model):
variation = models.ForeignKey(Variation, on_delete=models.CASCADE)
value = models.CharField(max_length=50) # small, medium large etc
class OrderItem(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
item_variations = models.ManyToManyField(ItemVariation)
quantity = models.IntegerField(default=1)
ordered = models.BooleanField(default=False)
class Order(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
ref_code = models.CharField(max_length=20)
ordered = models.BooleanField(default=False)
items = models.ManyToManyField(OrderItem)
start_date = models.DateTimeField(auto_now_add= True)
ordered_date = models.DateTimeField()
My order_summary.html(我可以在其中增加数量):
<a href="{% url 'remove-single-item-from-cart' order_item.item.slug %}" class="btn mr-2"><i class="fa fa-minus"></i></a>
{{ order_item.quantity }}<a href="{% url 'add-to-cart' order_item.item.slug %}" class="btn ml-2"><i class="fa fa-plus"></i></a>
My URL.py:
path('add_to_cart/<slug>/', orders_views.add_to_cart, name='add-to-cart'),
path('remove_from_cart/<slug>/', orders_views.remove_from_cart, name='remove-from-cart'),
没有更多的信息很难确定,所以我会问一些额外的问题:
抛出错误时slug的值是多少?(没有看到顶部张贴的url)什么是OrderItem型号原始答案:
话虽如此,我认为错误在于这一行:
order_item.item_variations.add(*variations)
。 我认为,变异是['Green', ...]
。我觉得在当前的模型设置中可能会出现类似order_item.item_variations.add(item.variation_set.filter(item_variation__value=...).first().pk)
的情况。我认为这是因为它看起来不像ItemVariation的值,而是add作为参数(或实例)的主键额外解释:
首先,我认为您检查商品是否已经在购物车中是错误的:
应该是:
我将其更改为检查值,在该值中可以找到要比较的字符串。我想前一个是在检查身份证。我还删除了
__exact
,但意识到__exact
隐含在固定版本中第二,我认为您使用
.add()
来表示RelatedManager
(您访问多对多字段的方式)是错误的。根据您的模型,ItemVariation
没有在模型中设置主键。这意味着django将为您自动生成一个。^^自动生成的字段将是一个自动字段,它是一个int。这意味着为了使用OrderItem.item_variations.add()
,您需要提供ItemVariation实例或ItemVariation的主键目前,您为它提供了一组字符串。要解决此问题,您需要查询ItemVariations以获得正确的实例。我建议将
order_item.item_variations.add(*variations)
改为多行方法:这应该可以修复错误,尽管它确实存在一个潜在的问题,即如果数据库中没有这些变体,该怎么办。这是你应该考虑的另一个问题,但超出了这个答案的范围
^
RelatedManager.add()
文档: https://docs.djangoproject.com/en/dev/ref/models/relations/#django.db.models.fields.related.RelatedManager.add^^自动主键文档: https://docs.djangoproject.com/en/dev/topics/db/models/#automatic-primary-key-fields
相关问题 更多 >
编程相关推荐