首页 > 解决方案 > 添加到购物车功能的 Django 选择字段

问题描述

我有一个带有价格选择字段的应用程序。其中两个类别有一个选项字段。我试图通过在views.py 上使用request.POST.get脚本来获得所需的客户大小以获取价格值,但它没有显示出来。

视图.py

@login_required      
def add_to_cart(request, slug):
    item = get_object_or_404(Item, slug=slug)
    order_item, created = OrderItem.objects.get_or_create(
        item=item,
        customer=request.user,
        ordered=False,
        price = request.POST.get('inlineRadioOptions')
    )
    order_qs = Order.objects.filter(customer=request.user, 
                                    ordered=False)
    if order_qs.exists():
        order = order_qs[0]
        if order.items.filter(item__slug=item.slug).exists():
            order_item.price = request.POST.get('inlineRadioOptions')
            order_item.price
            order_item.item_quantity += 1
            order_item.save()
            messages.success(request, 
                             "This item was updated to your cart."
                             )
        else:
            messages.success(request, 
                             "This item was added to your cart."
                             )
            order.items.add(order_item)
            order.save()
    else:
        order = Order.objects.create(
            customer=request.user)
        order.items.add(order_item)
        order.save()
        messages.success(request, 
                         "This item was added to your cart."
                         )
    return redirect("featured-food", slug=slug)

在 Views.py 上,我添加了price作为参数并使用脚本request.POST.get('inlineRadioOptions')来获取所选单选按钮的值,但它不起作用。

模型.py

class Item(models.Model):
    name = models.CharField(max_length=50)
    categories = models.CharField(choices=CATEGORY_CHOICES, max_length=50)
    sizes = models.CharField(choices=SIZES_CHOICES, max_length=50, null=True, blank=True)
    cake_size = models.CharField(choices=CAKE_CHOICES, max_length=50, null=True, blank=True)
    img = models.ImageField(upload_to=get_upload_path, null=True, blank=True)
    description = models.TextField()
    beverage_s_price = models.FloatField(null=True, blank=True)
    beverage_t_price = models.FloatField(null=True, blank=True)
    beverage_g_price = models.FloatField(null=True, blank=True)
    beverage_v_price = models.FloatField(null=True, blank=True)
    cake_slice_price = models.FloatField(null=True, blank=True)
    cake_whole_price = models.FloatField(null=True, blank=True)
    price = models.FloatField(default=0, null=True, blank=True)
    available = models.BooleanField(default=True)
    slug= models.SlugField(null=True, blank=True)
    
    def __str__(self):
        return str(self.name)
    
    def get_absolute_url(self):
        return reverse("featured-food", 
                       kwargs={"slug": self.slug})
    
    def get_add_to_cart_url(self):
        return reverse("add-to-cart", kwargs={
            'slug': self.slug
        })
    
    def get_remove_from_cart_url(self):
        return reverse("remove-from-cart", kwargs={
            'slug': self.slug
        })
        
    def get_add_to_cart_store_page_url(self):
        return reverse("add-to-cart-store-page", kwargs={
            'slug': self.slug
        })
    
    def get_remove_from_cart_store_page_url(self):
        return reverse("remove-from-cart-store-page", kwargs={
            'slug': self.slug
        })
    
    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Item, self).save(*args, **kwargs)
        

class OrderItem(models.Model):
    customer = models.ForeignKey(User, on_delete=models.CASCADE)
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    item_quantity = models.IntegerField(default=1)
    price = models.FloatField(default=0,null=True, blank=True)
    ordered = models.BooleanField(default=False)
    
    def __str__(self):
        return f"{self.item_quantity} of {self.item}"

商店.html

<div class="container my-5">
    <h1 class="mb-3"><strong>Beverages</strong></h1>
    <hr>
    <div class="row">
        {% for obj in object_list %}
            {% if obj.categories == "Beverage" %}
                <div class="col-lg-3 col-md-6 my-3 justify-content-center">
                    <img src="{{ obj.img.url }}" alt="">
                </div>
                <div class="col-lg-8 col-md-5 my-4 px-5">
                    <h4><strong>{{obj.name}}</strong></h4>
                    <p>{{obj.description|truncatechars:200}}</p>
                    {% if obj.categories == "Beverage" %}
                    <form method="POST" action="{{ obj.get_add_to_cart_store_page_url }}">
                      {% csrf_token %}
                    <div class="form-check form-check-inline">
                        <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio1" value="{{obj.beverage_s_price}}" checked>
                        <label class="form-check-label" for="inlineRadio1"><strong>Small </strong>₱ {{obj.beverage_s_price|floatformat:2 }}</label>
                      </div>
                      <div class="form-check form-check-inline">
                        <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio2" value="{{obj.beverage_t_price}">
                        <label class="form-check-label" for="inlineRadio2"><strong>Tall </strong>₱ {{obj.beverage_t_price|floatformat:2 }}</label>
                      </div>
                      <div class="form-check form-check-inline">
                        <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio3" value="{{obj.beverage_g_price}}">
                        <label class="form-check-label" for="inlineRadio3"><strong>Grande </strong>₱ {{obj.beverage_g_price|floatformat:2 }}</label>
                      </div>
                      <div class="form-check form-check-inline">
                        <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio4" value="{{obj.beverage_v_price}}">
                        <label class="form-check-label" for="inlineRadio4"><strong>Venti </strong>₱ {{obj.beverage_v_price|floatformat:2 }}</label>
                      </div>
                      
                      {% endif %}
                      {% if obj.categories == "Cake" %}
                      <div class="form-check form-check-inline">
                        <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio5" value="{{obj.cake_slice_price}}">
                        <label class="form-check-label" for="inlineRadio5"><strong>Slice </strong>₱ {{obj.cake_slice_price|floatformat:2 }}</label>
                      </div>
                      <div class="form-check form-check-inline">
                        <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio6" value="{{obj.cake_whole_price}}">
                        <label class="form-check-label" for="inlineRadio6"><strong>Whole </strong>₱ {{obj.cake_whole_price|floatformat:2 }}</label>
                      </div>
                      {% endif %}
                      {% if obj.categories != "Beverage" and obj.categories != "Cake" %}
                      <div class="">
                        <h6>₱ {{obj.price}}</h6>
                      </div>
                      {% endif %}
                      <div class="mt-2">
                        <small class="ml-5">Add to cart</small>
                        <button type="submit" class="btn btn-primary btn-md my-0 p"><i class="fas fa-plus"></i></a></button>
                        <a href="{{ obj.get_remove_from_cart_store_page_url }}" class="btn btn-danger btn-md my-0 p">
                          <i class="fas fa-minus"></i></a>
                      </div>
                    </form>
                </div>
                <hr>
            {% endif %}
        {% endfor %}
    </div>
</div>

标签: djangodjango-modelsdjango-viewsdjango-templates

解决方案


推荐阅读