【发布时间】:2020-05-05 17:09:27
【问题描述】:
我正在尝试向用户展示他们选择的产品变体。虽然代码正在运行并将变化保存在数据库中,但我无法在我的 html 页面上显示它们。只有: 正在呈现。如果我尝试{{ order_item.variation.all }},它会给出一个空查询集,例如:<QuerySet []>。如果我尝试{{ order_item.variation }},它会说:products.Variation.None。问题是什么?我叫它的方式不对吗?这是我尝试过的:
我的models.py:
class Variation(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE, null=True, blank=True)
variation_type = models.CharField(max_length=120, choices=VAR_TYPES, default='Size')
title = models.CharField(max_length=120, null=True, blank=True)
price = models.FloatField(null=True, blank=True)
is_available = models.BooleanField(default=True)
objects = VariationManager()
class OrderItem(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
variation = models.ManyToManyField(Variation)
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)
variation = models.ManyToManyField(Variation)
我的 order_summary.html:
{% for order_item in object.items.all %}
<tbody>
<tr>
<th scope="row" class="border-0">
<div class="p-2">
<img src="{{ order_item.item.image_url }}" alt="" width="70" class="img-fluid rounded shadow-sm">
<div class="ml-3 d-inline-block align-middle">
<h5 class="mb-0"> <a href="{{ order_item.item.get_absolute_url }}" class="text-dark d-inline-block align-middle">{{ order_item.item.title }}</a>
{% if order_item.variation %}
<ul>
<h6>{{ order_item.variation.variation_type }} : {{ order_item.variation.title }}</h6>
</ul>
{% endif %}
</div>
</div>
</th>
我的意见.py:
@login_required
def add_to_cart(request, slug):
item = get_object_or_404(Item, slug=slug)
order_item, created = OrderItem.objects.get_or_create(
item=item,
user= request.user,
ordered=False,
)
order_qs = Order.objects.filter(user=request.user, ordered=False)
if order_qs.exists():
order = order_qs[0]
if order.items.filter(item__slug=item.slug).exists():
order_item.quantity += 1
order_item.save()
messages.success(request, "Product quantity has been updated.")
else:
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")
class OrderSummaryView(LoginRequiredMixin, View):
def get(self, *args, **kwargs):
try:
order = Order.objects.get(user=self.request.user, ordered=False)
context = {
'object': order
}
return render(self.request, 'orders/order_summary.html', context)
except ObjectDoesNotExist:
messages.warning(self.request, "You do not have an active order")
return redirect("/")
【问题讨论】:
-
您应该在模型中进行一些重构,以使您的代码更具可读性,并且很可能会解决您的问题。 ForeignKey 和 ManyToManyField 应使用参数 related_name docs.djangoproject.com/en/3.0/ref/models/fields/… 声明。在您的视图中尝试打印(order.variation)并确认其为空。 Order 模型不应该需要 Variation 外键,因为 OrderItem 已经有了它
-
用户可以在将产品添加到购物车时选择变体。我已经用 add_to_cart 视图更新了我的问题。是因为它而发生的吗?
-
是的,他们可以更改 OrderItem 的变体...这没有数据库模型的意义。
-
重新考虑您的数据库模式和实施。并阅读有关 related_name 的文档,这对于您要实现的目标非常重要
-
好的朋友,稍后我会发布一个更具体的解决方案,以提供更多帮助
标签: html django django-models