You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何在购物车表单中展示服装的可选尺码?

问题:Django购物车表单动态加载商品可选尺码

我用Django开发在线服装店,现在遇到个问题:给商品加购物车的表单里,要显示对应商品的可选尺码,这个尺码存在Product模型的MultiSelectField字段里,但不知道怎么在表单里动态获取对应商品的尺码选项。

当前代码情况:

  • models.py的Product模型用sizes字段(MultiSelectField)存储可选尺码
  • forms.py的CartAddProductForm缺少尺码选择字段
  • views.py的product_detail视图已获取Product实例,但未传递给表单
  • 尝试编写了get_sizes函数,但不知道如何关联Product实例

解决方案

1. 修改forms.py:让表单支持传入Product实例,动态生成尺码选项

修改CartAddProductForm,添加构造方法接收product参数,动态生成size字段的可选值:

from django import forms
from .models import Product

PRODUCT_QUANTITY_CHOICES = [(i, str(i)) for i in range(1, 21)]

class CartAddProductForm(forms.Form):
    quantity = forms.TypedChoiceField(choices=PRODUCT_QUANTITY_CHOICES, coerce=int)
    update = forms.BooleanField(required=False, initial=False, widget=forms.HiddenInput)
    size = forms.ChoiceField(choices=[])  # 先初始化空选项

    def __init__(self, *args, **kwargs):
        # 取出传入的product参数
        self.product = kwargs.pop('product', None)
        super().__init__(*args, **kwargs)
        # 若传入product,动态设置尺码选项
        if self.product:
            # 将商品的可用尺码转为ChoiceField需要的二元组格式
            size_choices = [(size, size) for size in self.product.sizes]
            self.fields['size'].choices = size_choices

2. 修改views.py:实例化表单时传入Product实例

在product_detail视图中,创建CartAddProductForm时传入获取到的product对象:

def product_detail(request: WSGIRequest, product_id: int, product_slug: str) -> HttpResponse:
    product = get_object_or_404(Product,
                                id=product_id,
                                slug=product_slug,
                                available=True)
    # 传入product参数实例化表单
    cart_product_form = CartAddProductForm(product=product)
    return render(request, 'shop/product/detail.html', {'product': product,
                                                        'cart_product_form': cart_product_form})

3. 模板优化(可选)

调整模板渲染方式,让表单字段更美观,同时移除重复的尺码展示:

{% extends "shop/base.html" %}
<head>
    <meta charset="UTF-8">
    <title>Detail</title>
</head>
<body>
{% block content %}
    <br>
    <b>{{ product.name }} </b> <br>
    <i>{{ product.description }} </i> <br>
    {{ product.price }} <br>
    <img src="{{ product.image.url }}" width="300" height="500"> <br>
    <form action="{% url "cart:add_to_cart" product.id %}" method="post">
        {{ cart_product_form.as_p }}
        {% csrf_token %}
        <input type="submit" value="Add to cart">
    </form>
{% endblock %}
</body>

内容的提问来源于stack exchange,提问作者pizhlo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:35:17