Django: Невозможно отобразить цвета связанных продуктов
У меня проблемы с отображением цветов связанных товаров в моем шаблоне Django. У меня есть модель Product
с отношением «многие-ко-многим» с моделью Color
, и я хочу отобразить цвета связанных товаров.
Вот мое мнение:
def product_varient_detail_view(request, pid):
# ...
colors = []
linked_colors = []
if product_variant.color.exists():
colors = product_variant.color.all()
if product_variant.color.exists():
for color in product_variant.color.all():
for linked_product in color.product_varients.all():
if linked_product != product_variant:
linked_colors.extend(linked_product.color.all())
context = {
# ...
'colors': colors,
'linked_colors': linked_colors,
}
return render(request, "core/product_varient_detail.html", context)
А вот мой шаблон:
{% if colors %}
{% for c in colors %}
<div class="color__radio">
<input type="radio" id="color_{{ c.id }}" name="color"
data-image-url="{{ c.image.url }}"
class="color-input"
data-url="{% url 'core:product_varient_detail' c.product_varients.first.pid %}?color={{ c.coid }}">
<label class="color__radio-label"
for="color_{{ c.id }}"
style="background-color: {{ c.code }};"></label>
</div>
{% endfor %}
{% endif %}
{% if linked_colors %}
{% for c in linked_colors %}
<div class="color__radio">
<input type="radio" id="color_{{ c.id }}" name="color"
data-image-url="{{ c.image.url }}"
class="color-input"
data-url="{% url 'core:product_varient_detail' c.product_varients.first.pid %}?color={{ c.coid }}">
<label class="color__radio-label"
for="color_{{ c.id }}"
style="background-color: {{ c.code }};"></label>
</div>
{% endfor %}
{% endif %}
Однако цвета связанных товаров не отображаются. Я пробовал отлаживать код, но не уверен, что происходит не так. Может ли кто-нибудь помочь мне разобраться в проблеме?
Модели:
class Color(models.Model):
# ...
product_varients = models.ManyToManyField('Product', related_name='color_variants', blank=True)
class Product(models.Model):
pid=ShortUUIDField(length=10,max_length=100,prefix="prd",alphabet="abcdef")
user=models.ForeignKey(CustomUser, on_delete=models.SET_NULL ,null=True)
cagtegory=models.ForeignKey(Category, on_delete=models.SET_NULL ,null=True,related_name="category")
color=models.ManyToManyField(Color,blank=True)
Я подправил логику в вашем product_varient_detail_view
, чтобы все уникальные цвета из связанных продуктов собирались правильно, без дублирования.
def product_varient_detail_view(request, pid):
product_variant = get_object_or_404(Product, pid=pid) # Adjust according to your actual model
colors = product_variant.color.all()
# Create a set to avoid duplicate linked colors
linked_colors = set()
for color in colors:
for linked_product in color.product_varients.exclude(id=product_variant.id):
linked_colors.update(linked_product.color.all())
linked_colors = list(linked_colors)
context = {
'colors': colors,
'linked_colors': linked_colors,
}
return render(request, "core/product_varient_detail.html", context)
Вот код шаблона для отображения как цветов выбранного варианта товара, так и связанных цветов.
{% if colors %}
<h3>Available Colors</h3>
{% for c in colors %}
<div class="color__radio">
<input type="radio" id="color_{{ c.id }}" name="color"
data-image-url="{{ c.image.url }}"
class="color-input"
data-url="{% url 'core:product_varient_detail' c.product_varients.first.pid %}?color={{ c.coid }}">
<label class="color__radio-label"
for="color_{{ c.id }}"
style="background-color: {{ c.code }};"></label>
</div>
{% endfor %}
{% endif %}
{% if linked_colors %}
<h3>Linked Product Colors</h3>
{% for c in linked_colors %}
<div class="color__radio">
<input type="radio" id="linked_color_{{ c.id }}" name="linked_color"
data-image-url="{{ c.image.url }}"
class="color-input"
data-url="{% url 'core:product_varient_detail' c.product_varients.first.pid %}?color={{ c.coid }}">
<label class="color__radio-label"
for="linked_color_{{ c.id }}"
style="background-color: {{ c.code }};"></label>
</div>
{% endfor %}
{% endif %}
Надеюсь, это немного поможет вам.