Как я могу фильтровать варианты (размер - цвет) при выборе размера товара показать цвет товара, который сохранен в базе данных в 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>