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 %}

Надеюсь, это немного поможет вам.

Вернуться на верх