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
相关产品推荐
相关产品推荐

