Django:无法显示模板的变体

Django: cannot display variations to the template

我正在尝试为产品实施变体。问题是,当我尝试通过下拉菜单在网页上显示产品时,我得到的是产品名称而不是尺寸。 我的应用程序已经包含按类别过滤的产品。我想在我的产品详细信息中显示尺寸 html

models.py

class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE, default=1)
    name = models.CharField(max_length=200)
    price = models.FloatField()
    digital = models.BooleanField(default=False, null=True, blank=True)
    image = models.ImageField(null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    slug = models.SlugField(max_length=255, unique=True, default=uuid.uuid1)

    def __str__(self):
        return self.name

    @property
    def imageURL(self):
        try:
            url = self.image.url
        except:
            url = ''
        return url


    class Meta:
        unique_together = ('name', 'slug')

    def get_price(self):
        return self.price

    def get_absolute_url(self):
        return reverse('single_product', kwargs={'slug': self.slug})


class VariationManager(models.Manager):
    def sizes(self):
        return super(VariationManager, self).filter(category='size')

    def colors(self):
        return super(VariationManager, self).filter(category='colors')


VAR_CATEGORIES = (
    ('size', 'size'),
    ('color', 'color')
)


class Variation(models.Model):
    title = models.CharField(max_length=50)
    category = models.CharField(max_length=120, choices=VAR_CATEGORIES, default='size')
    price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=100)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

    objects = VariationManager

    def __str__(self):
        return self.title

product.html

这里是HTML我的产品详细视图

{% extends "store/main.html" %}



{% block content %}
{% load static %}


<link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Tutorial</title>
    <!-- Fonts -->
    <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500" rel="stylesheet">
    <!-- CSS -->
    <link href="static/css/style.css" rel="stylesheet">
    <meta name="robots" content="noindex,follow" />

  </head>

  <body>
    <main class="container">

      <!-- Left Column / Headphones Image -->



      <!-- Right Column -->
      <div class="right-column">

        <!-- Product Description -->
        <div class="product-description">
          <span></span>
            <h1>{{product.name}}</h1>
                  <div class="left-column">
        <img data-image="black" src="{{ product.imageURL }}"
             width="400"
             height="500">


      </div>
            <p>"{{product.description}}"</p>
        </div>

          <div class="col-sm-4 pull-right">

                  {% if product.variation_set.all %}
                  <select class="form-control" name="size">
                      {% for products in product.variation_set.all %}

                      <option value="{{ product.name|lower }}">{{ product.name|capfirst }}</option>
                      {% endfor %}
                  </select>
              {% endif %}



        <!-- Product Configuration -->

        </div>

        <!-- Product Pricing -->
        <div class="product-price">
            <button data-product="{{product.id}}" data-action="add" class="btn btn-outline-secondary add-btn update-cart">Add to Cart</button>

            <div class="product-configuration">
              <a href="#">How to take the measurements</a>
            </div>
        </div>
      </div>
    </main>

    <!-- Scripts -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" charset="utf-8"></script>
    <script src="static/js/script.js" charset="utf-8"></script>
  </body>
</html>

{% endblock %}

Full Code

您输入有误

{% for products in product.variation_set.all %}    
     <option value="{{ product.name|lower }}">{{ product.name|capfirst }}</option>
 {% endfor %}

我觉得应该是

<option value="{{ products.name|lower }}">{{ products.name|capfirst }}</option>

因为您正在以产品作为元素循环 product.variations。

显示变体名称的奥秘在于,在我的 product.html 模板中,我使用了 product.name|lower,它通过 ID 返回产品名称。

{% for products in product.variation_set.all %}

    <option 

value="{{ product.name|lower }}">{{product.name|capfirst}}

    </option>
我的 views.py:

中 class 的

product returns 个对象

def product_detail(request, category_slug, slug):
product = Product.objects.get(slug=slug)
variation = Variation.objects.all()

context = {
    'product': product,
    'variation': variation
}
return render(request, 'store/product.html', context)

因此,相反,我需要 slug

的类别名称

这就是products returns:

def category_detail(request, slug):
category = get_object_or_404(Category, slug=slug)
products = category.products.all()

context = {
    'category': category,
    'products': products,
}

return render(request, 'store/category_detail.html', context)

我们需要类别中的所有产品,并且 运行 找到变体的名称。 通过product.html

中的for循环实现查找商品对应的variation