html - 在 Django 中访问模型属性
问题描述
我试图向用户展示他们选择的产品变体。虽然代码正在运行并将变化保存在数据库中,但我无法在我的 html 页面上显示它们。只有:
正在渲染。如果我尝试{{ order_item.variation.all }}
它会给出一个空的查询集,例如 : <QuerySet []>
。如果我尝试{{ order_item.variation }}
,它会说:products.Variation.None
。问题是什么?我叫它的方式不对吗?这是我尝试过的:
我的模型.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("/")
解决方案
重构models.py
:
class Variation(models.Model):
item = models.ForeignKey(Item, related_name='item_variations', 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 Order(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='orders', on_delete=models.CASCADE)
ref_code = models.CharField(max_length=20)
ordered = models.BooleanField(default=False)
class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name='order_order_items', on_delete=models.CASCADE)
item = models.ForeignKey(Item, related_name='item_order_items', on_delete=models.CASCADE)
variation = models.ForeignKey(Variation, related_name='order_item_variations', on_delete=models.CASCADE, null=True, blank=True)
quantity = models.IntegerField(default=1)
您可以通过以下示例访问用户的订单
first_user = User.objects.all().first()
orders = first_user.orders.all()
您可以通过以下示例访问订单的商品
first_order = Order.objects.all().first()
order_items = first_order.order_items.all()
您需要重构 html 和 views.py 但它应该非常简单
推荐阅读
- java - 我想在 onCreate 期间使子线性布局不可见,然后在点击按钮时使其可见
- python - 为什么我会收到“TypeError: '_gdbm.gdbm' object is not iterable”?
- javascript - 重新加载页面时如何使js计时器不重新启动?
- odoo - Odoo 13:如何解决两个冲突的 odoo 主题?
- c# - 如何修复asp.net中的滑块
- node.js - 在 nodejs 中运行 mocha 测试的问题
- r - 如何在ggplot中创建对应并合并的图例?
- c# - 如何从布局中的部分视图中获取实际视图的 URL
- azure-active-directory - 通过 Azure AD 进行本地网络共享访问
- android - ScrollView 剪切 TextView 中的最后一行