Django, чекбокс, добавление товаров в корзину с размерами, которые пользователь выбирает при нажатии на чекбокс
Добрый день всем.
Пожалуйста, не судите строго, я только учусь. Я начал изучать Django и вроде бы все шло гладко, пока я не столкнулся с проблемой добавления товара в корзину вместе с размером. С добавлением самого товара проблем нет, но мне нужно, чтобы пользователь выбрал размер через чекбокс и после нажатия на кнопку "добавить в корзину" в нее добавился не просто товар, а с нужным выбранным размером.
Здесь представлены модели продуктов, размеры и тележки
class Product(models.Model):
article = models.CharField(max_length=12,null=False,blank=False,unique=True,primary_key=True)
img = models.ImageField(upload_to='products_images')
price = models.DecimalField(max_digits=9,decimal_places=2)
description = models.TextField(null=True,blank=True)
gender = models.CharField(max_length=12,null=False,blank=False)
is_child = models.BooleanField(null=False)
season = models.CharField(max_length=12,null=False)
color = models.CharField(max_length=24,null=False)
sizes = models.ForeignKey(to='Size',on_delete=models.CASCADE,to_field='article')
def __str__(self):
return f"{self.article}"
class Size(models.Model):
article = models.CharField(max_length=12,null=False,unique=True)
article_size = models.ForeignKey(to='ArticleSize',on_delete=models.CASCADE,to_field='article_size')
def __str__(self):
return f"{self.article}"
class ArticleSize(models.Model):
article_size = models.CharField(max_length=12, null=False, unique=True)
size_name = models.CharField(max_length=12,null=False,blank=False)
qty = models.SmallIntegerField()
to_article = models.CharField(max_length=12, null=False)
def __str__(self):
return f"{self.article_size}"
class Basket(models.Model):
user = models.ForeignKey(to=User, on_delete=models.CASCADE)
product = models.ForeignKey(to=Product, on_delete=models.CASCADE,to_field='article')
size = models.ForeignKey(to=ArticleSize,on_delete=models.CASCADE,to_field='article_size')
qty = models.PositiveSmallIntegerField(default=0)
create_time_stamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Корзина для {self.user.email} товар {self.product.article},размер {self.size.size_name}"
Вот модель формы:
class CheckboxForm(forms.Form):
checkbox_size = forms.CharField(widget=forms.CheckboxInput(attrs={
'class':'size_checkbox', 'type':'checkbox', 'name':'size_checkbox'}),required=True)
class Meta:
model = ArticleSize
fields = ('checkbox_size')
Вот вид:
def products(request):
form = CheckboxForm()
context = {
'title': "Магазин",
'footer_1': "127015, Москва, Бумажный пр-д., д. 14, стр. 2 ООО «НИКАМЕД».",
'footer_2': "Копирование материалов запрещено.",
'products': Product.objects.all(),
'sizes': Size.objects.all(),
'article_size': ArticleSize.objects.all(),
'form': form,
}
return render(request, 'products/products.html', context)
def basket_add(request,product,size):
product = Product.objects.get(article=product)
size = ArticleSize.objects.get(article_size=size)
basket = Basket.objects.filter(user=request.user,product=product,size=size)
if not basket.exists():
Basket.objects.create(user=request.user,product=product,qty=1,size=size)
else:
basket = basket.last()
basket.qty += 1
basket.save()
return HttpResponseRedirect(request.META['HTTP_REFERER'])
Вот HTML:
Расскажите, как решаются подобные проблемы? Может быть, я двигаюсь в неправильном направлении и мне нужно все переписать?
Извините за путаницу, я готов разъяснить все, что необходимо.
Заранее всем спасибо!
Я пытаюсь отправить на просмотр товар с выбранным размером.
Я немного подправил код, теперь все работает, ну, почти работает. Если я жестко кодирую данные об объекте size из шаблона в представлении, то все нормально, но если я просто пытаюсь получить значение из request.POST.get('size'), то всегда получаю None.
Вот исправленные модели, шаблон и вид.
Модели:
class Product(models.Model):
article = models.CharField(max_length=12,null=False,blank=False,unique=True,primary_key=True)
img = models.ImageField(upload_to='products_images')
price = models.DecimalField(max_digits=9,decimal_places=2)
description = models.TextField(null=True,blank=True)
gender = models.CharField(max_length=12,null=False,blank=False)
is_child = models.BooleanField(null=False)
season = models.CharField(max_length=12,null=False)
color = models.CharField(max_length=24,null=False)
sizes = models.ForeignKey(to='Size',on_delete=models.CASCADE,to_field='article_size')
def __str__(self):
return f"{self.article}"
class Size(models.Model): article_size = models.CharField(max_length=12,null=False,unique=True,primary_key=True) название_размера = models.CharField(max_length=12, null=False, blank=False) qty = models.SmallIntegerField() to_article = models.CharField(max_length=12, null=False)
def __str__(self):
return f"{self.article_size}"
class Basket(models.Model): user = models.ForeignKey(to=User, on_delete=models.CASCADE) product = models.ForeignKey(to=Product, on_delete=models.CASCADE,to_field='article') size = models.ForeignKey(to=Size,on_delete=models.CASCADE,to_field='article_size') qty = models.PositiveSmallIntegerField(default=0) create_time_stamp = models.DateTimeField(auto_now_add=True) def str(self): return f "Корзина для {self.user.email} товара {self.product.article},размер {self.size.size.size_name}"
Шаблон:
Вид:
Does anyone know why None appears when submitting a button? Maybe I forgot to specify an attribute?
Спасибо.
Кто-нибудь знает, почему при отправке кнопки появляется None? Может быть, я забыл указать атрибут?
Спасибо.
Я решил эту проблему. Если кто-то заинтересуется, пожалуйста, дайте мне знать, и я напишу решение здесь.