Я пытаюсь реализовать варианты для продуктов. Проблема в том, что когда я пытаюсь отобразить продукты на веб-странице через раскрывающееся меню, вместо размеров я получаю название продукта. В моем приложении уже есть продукты, отфильтрованные по категориям. Я хочу показать размеры в подробном 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 %}
У вас опечатка в
{% 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 с продуктами в качестве элемента.
что он отображает, если вы делаете только {{ products }}?
Он отображает размеры. Я очень запутался... Не могли бы вы объяснить? :)
Не могли бы вы отредактировать свой вопрос, указав, что возвращают {{ products }}?
Загадка с отображением названия вариации заключалась в том, что в моем шаблоне 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.
теперь в раскрывающемся списке отображаются пустые поля :(