Как я могу фильтровать варианты (размер - цвет) при выборе размера товара показать цвет товара, который сохранен в базе данных в django?

любитель яцина в django

приветствую всех Я вот-вот закончу свой первый проект, в вебвизоре. Столкнулся с проблемой, честно говоря, которую не могу решить. Я просто столкнулся с проблемой, когда я открываю страницу для конкретного товара, и выбираю конкретный размер, цвета не меняются в соответствии с тем, что хранится в базах данных по каждому размеру

например

**product 1**    **size**: s l m xl    **color**: red black yellow
if i save variant for **product 1** as **size**: xl with **color**: red
when i select **size** in product-sidebare.html i can not show just **color** red

это мой код

model.py

class Add_Product(models.Model):
    
    STATUS = (
        ('True', 'True'),
        ('False', 'False'),
    )

    VARIANTS = (
        ('None', 'None'),
        ('Size', 'Size'),
        ('Color', 'Color'),
        ('Size-Color', 'Size-Color'),

    )
    article_author = models.ForeignKey(User, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, max_length=200, on_delete=models.CASCADE)
    title = models.CharField('العنوان', max_length=9500)
    slug = models.SlugField(max_length=250, allow_unicode=True, unique =True)
    image = models.FileField( upload_to = 'Images', blank=True)
    price = models.DecimalField(max_digits=12, decimal_places=2,default=0)
    variant=models.CharField(max_length=10,choices=VARIANTS, default='None')
    posted_on = models.DateTimeField(auto_now=False, auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True, auto_now_add=False)
    read = models.PositiveIntegerField(default=0, verbose_name='Vu')
    publish = models.DateTimeField(default=timezone.now) 
   
    
    
    
    def __str__(self):
        return self.title


    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super(Add_Product, self).save(*args, **kwargs)



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


class PostImage(models.Model):
    post_images = models.ForeignKey(Add_Product, default=None, on_delete=models.CASCADE)
    images = models.FileField(upload_to = 'images/')
    def __str__(self):
        return self.post_images.title


class Color(models.Model):
    name = models.CharField(max_length=20)
    code = models.CharField(max_length=10, blank=True,null=True)
    def __str__(self):
        return self.name
    def color_tag(self):
        if self.code is not None:
            return mark_safe('<p style="background-color:{}">Color </p>'.format(self.code))
        else:
            return ""


class Size(models.Model):
    name = models.CharField(max_length=20)
    code = models.CharField(max_length=10, blank=True,null=True)
    def __str__(self):
        return self.name


class Variants(models.Model):
    title = models.CharField(max_length=100, blank=True,null=True)
    product = models.ForeignKey(Add_Product, on_delete=models.CASCADE)
    color = models.ForeignKey(Color, on_delete=models.CASCADE,blank=True,null=True)
    size = models.ForeignKey(Size, on_delete=models.CASCADE,blank=True,null=True)
    quantity = models.IntegerField(default=1)
    price = models.DecimalField(max_digits=12, decimal_places=2,default=0)

    def __str__(self):
        return self.title

views.py

def show_product(request, id,slug):

    
   
    query = request.GET.get('q')
            # show second article
    post = get_object_or_404(Add_Product, id=id, slug = slug)
   
    product = Add_Product.objects.get(pk = id)
    related_product = Add_Product.objects.order_by('id')[:4]
    also_like = Add_Product.objects.order_by('id')[:4]
    photos = PostImage.objects.filter(post_images=post)
   
    
    context = {
         'product': product,
         
         'full_name': request.user.username,
         'post': post,
         'photos': photos,
         'related_product': related_product,
         'also_like': also_like,
        
          }
    if product.variant !="None": # Product have variants
        if request.method == 'POST': #if we select color
            variant_id = request.POST.get('variantid')
            variant = Variants.objects.get(id=variant_id) #selected product by click color radio
            colors = Variants.objects.filter(product_id=id,size_id=variant.size_id )
            sizes = Variants.objects.raw('SELECT * FROM  product_variants  WHERE product_id=%s GROUP BY size_id',[id])
            query += variant.title+' Size:' +str(variant.size) +' Color:' +str(variant.color)
        else:
            variants = Variants.objects.filter(product_id=id)
            colors = Variants.objects.filter(product_id=id,size_id=variants[0].size_id )
            sizes = Variants.objects.raw('SELECT * FROM  product_variants  WHERE product_id=%s GROUP BY size_id',[id])
            
            variant =Variants.objects.get(id=variants[0].id)

        context.update({'sizes': sizes, 'colors': colors,
                        'variant': variant,'query': query
                        })
   
   
  
    return render(request, 'home/product-sidebar.html', context)


def ajaxcolor(request):
    data = {}
    if request.POST.get('action') == 'post':
        size_id = request.POST.get('size')
        productid = request.POST.get('productid')
        colors = Variants.objects.filter(product_id=productid, size_id=size_id)
        context = {
            'size_id': size_id,
            'productid': productid,
            'colors': colors,
        }
        data = {'rendered_table': render_to_string('color_list.html', context=context)}
        return JsonResponse(data)
    return JsonResponse(data)

product-sidebare.html

color-list.html

<input type="hidden" name="size" id="size" value="{{ size_id }}">
<ul class="color-option" >
    <li><span class="text-uppercase">Color:</span></li>
    {% for rs in colors %}
        <input type="radio" name="variantid" id="variantid" value="{{ rs.id }}" onchange="this.form.submit();">
        <li >
            <a href="#" style="background-color:{{ rs.color.code }}; color: #D9D9D9; text-shadow: 1px 1px #000000; width: 70px" >
                {{ rs.color }} ${{ rs.price }}
            </a>
            <img src="{{ rs.image }}" style="height: 70px">
        </li>
    {% endfor %}
</ul>

изображение моего сайта электронной коммерции enter image description here

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