Форма отправляется только при наличии двух дубликатов форм
Я пытаюсь создать сайт на Django, где пользователи могут вводить коды купонов для своих заказов, чтобы получать скидки. Поэтому у меня есть форма в файле cart.html
, где пользователь может ввести код купона и получить скидку. Но самое странное, что функция Apply Coupon работает только тогда, когда есть две дублирующие формы друг на друге. Если я удалю хотя бы одну из них и оставлю одну форму, как и должно быть, код не работает, купон не применяется, url страницы застревает на http://127.0.0.1:8000/cart/?csrfmiddlewaretoken=ey3yy96SxX8msYViSD5aiT8TwCwyK5sCRJ9h48TMf3LQeGOmXFl05i2p7gLKta9s&coupon_code=SM20#
.
Я понятия не имею, почему он работает только при наличии двух форм и почему он застревает, когда есть только одна форма. Кто-нибудь может мне помочь, пожалуйста? Заранее спасибо!
Мой models.py:
class CartItem(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='cart_items')
course = models.ForeignKey(Course, on_delete=models.CASCADE)
added_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.user.username} added {self.course.title}"
class Coupon(models.Model):
code = models.CharField(max_length=20, unique=True)
discount_percentage = models.PositiveIntegerField(null=True, blank=True)
fixed_discount = models.PositiveIntegerField(null=True, blank=True)
is_active = models.BooleanField(default=True)
users_used = models.ManyToManyField(User, related_name='used_coupons', blank=True)
def __str__(self):
return self.code
Мой views.py:
@login_required
def apply_coupon(request):
if request.method == 'POST':
coupon_code = request.POST.get('coupon_code')
try:
coupon = Coupon.objects.get(code__exact=coupon_code, is_active=True)
if coupon.users_used.filter(id=request.user.id).exists():
messages.error(request, 'You have already used this coupon code.')
return redirect('cart')
cart_items = CartItem.objects.filter(user=request.user)
total_price = sum(item.course.price for item in cart_items)
if coupon.discount_percentage:
discount_amount = total_price * (Decimal(coupon.discount_percentage) / 100)
discount_amount = int(discount_amount)
elif coupon.fixed_discount:
discount_amount = coupon.fixed_discount
else:
messages.warning(request, 'Invalid coupon code.')
return redirect('cart')
coupon.users_used.add(request.user)
request.session['coupon_code'] = coupon_code
request.session['discount_amount'] = discount_amount
messages.success(request, f'Coupon "{coupon_code}" applied successfully.')
except Coupon.DoesNotExist:
messages.warning(request, 'Invalid coupon code.')
return redirect('cart')
@login_required
def cart(request):
cart_items = CartItem.objects.filter(user=request.user)
total_price = sum(cart_item.course.price for cart_item in cart_items)
# Get discount amount from session if available
discount_amount = request.session.get('discount_amount', 0)
if discount_amount == 0:
final_price = total_price
else:
coupon_code = request.session.get('coupon_code')
try:
coupon = Coupon.objects.get(code__exact=coupon_code, is_active=True)
final_price = total_price - discount_amount
except Coupon.DoesNotExist:
request.session.pop('coupon_code', None)
request.session.pop('discount_amount', None)
final_price = total_price
context = {
'cart_items': cart_items,
'total_price': total_price,
'discount_amount': discount_amount,
'final_price': final_price,
}
return render(request, 'checkout/cart.html', context)
Моя корзина.html: