Django: не может отображать варианты шаблона

Я пытаюсь реализовать варианты для продуктов. Проблема в том, что когда я пытаюсь отобразить продукты на веб-странице через раскрывающееся меню, вместо размеров я получаю название продукта. В моем приложении уже есть продукты, отфильтрованные по категориям. Я хочу показать размеры в подробном HTML-коде моего продукта

модели.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

продукт.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 %}

Полный код

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
23
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У вас опечатка в

{% 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 с продуктами в качестве элемента.

теперь в раскрывающемся списке отображаются пустые поля :(

Artemii Khristich 18.03.2022 10:39

что он отображает, если вы делаете только {{ products }}?

TrueGopnik 18.03.2022 10:43

Он отображает размеры. Я очень запутался... Не могли бы вы объяснить? :)

Artemii Khristich 18.03.2022 10:46

Не могли бы вы отредактировать свой вопрос, указав, что возвращают {{ products }}?

TrueGopnik 18.03.2022 11:07
Ответ принят как подходящий

Загадка с отображением названия вариации заключалась в том, что в моем шаблоне product.html я использовал product.name|lower, который возвращал название товара по ID.

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

    <option 

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

    </option>

product возвращает объекты класса в моем просмотры.py:

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)

Поэтому вместо этого мне нужно было название категории по слагу

Вот что возвращает products:

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)

Нам нужны все товары в категории и бегом находим название вариации. Поиск соответствующего вариация продукта осуществляется через цикл for в продукт.html.

Другие вопросы по теме