首页 > 解决方案 > 在 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("/")

标签: htmldjangodjango-models

解决方案


重构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 但它应该非常简单


推荐阅读