我想用 Django4.1 实现一个购物车(处于注销状态),如亚马逊、乐天等。
所以,我尝试使用Session写代码,而不是使用Database和ModelForm。
但是,我卡住了,不知道怎么办。
乐天的购物车(https://www.rakuten.co.jp/)显示数量的选择框,选择框的数量与我们添加商品到购物车后的商品种类相同。
当我用开发工具检查 HTML 时,我在乐天购物车中找到了和。
我可以显示多个表单,例如 CartForm,但所有表单都在 HTML 中显示 并且它们没有分开。 所以,如果我更改其中一个表格,例如将数量更改为30,则所有表格的数量都将变为30. 我找到了以下页面,但它们似乎不是解决方案,因为它们无法动态更改“名称”属性。 ・https://progl.hatenablog.com/entry/2017/07/23/185923 ・https://www.appsloveworld.com/django/100/20/change-the-name-attribute-of-form-field-in-django-template-using 此外,我想将从 Session 获取的初始数字、数量推送到每个表单,但我不知道该怎么做(在我的代码中,所有数量都是 1)。 我试过了, views.py cart_form = CartForm(initial=???) 表格.py def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['quantity'].initial = ??? 但这两种方法都行不通。 我要实现的是 我想将Session中存储的“数量”的每个值设置为每个Form的初始值。 我想单独显示表格(例如:项目 A 的表格和项目 B 的另一个表格)或更改“名称”属性(例如: 的表格, 的另一个表格) 简而言之,无需登录的亚马逊和乐天购物车。 我搜索了,大部分案例都是日文的,但遗憾的是我找不到解决方案。 任何建议都是有帮助的。 谢谢。 PS:对不起,我知道我的英语很奇怪。我已经 7 年多没用过英语了,而且变得很糟糕。 这是我的代码(我省略了一些无关的部分)。 ◆views.py import uuid from django.shortcuts import render, redirect from django.views.decorators.http import require_http_methods # request.session data example # { # ‘cart’: {‘4’: {'item_id': 4, 'quantity': 3, 'stored': 'no'}, # '6': {'item_id': 6, 'quantity': 2, 'stored': 'no'}, # '7': {'item_id': 7, 'quantity': 1, 'stored': 'no’}}, # ‘cart_uuid’: UUID('4454d486-c676-414e-a4b8-5492d629f145’), # } @require_http_methods(['GET', 'POST']) def cart_detail(request, uuid): if "cart" not in request.session: initiate_shopping_session(request) if request.method == 'POST': cart_form = CartForm(request.POST or None) if cart_form.is_valid(): do_something() return redirect("shopping:cart_detail", uuid=uuid) else: cart_form = CartForm() # initialを入れるためには以下のforの中に入れる? cart = request.session.get("cart") item_ids = [int(c) for c in cart] added_items = ItemPhoto.objects.select_related('item').filter(item_id__in=item_ids).filter(priority=1) items = [] total_price: int = 0 for added_item in added_items: quantity = request.session['cart'][str(added_item.item.pk)].get("quantity") item_dict = { 'item_id': added_item.item.pk, 'name': added_item.item.name, 'photo': added_item.photo, 'price': added_item.item.price, 'quantity': quantity, } items.append(item_dict) total_price += added_item.item.price * quantity context = { 'items': items, 'total_price': '{:,.0f}'.format(total_price), 'cart_form': cart_form, } return render(request, "shopping/cart_detail.html", context) ◆urls.py from django.urls import path from django.urls import re_path from shopping import views app_name = "shopping" urlpatterns = [ path("item_detail/<int:pk>/", views.item_detail, name="item_detail"), path("cart/detail/<uuid:uuid>/", views.cart_detail, name="cart_detail"), ] ◆表格.py from django import forms choice_quantities = ((i, i) for i in range(1, 21)) class CartForm(forms.Form): quantity = forms.ChoiceField( label=‘Quantity’, required=True, choices=choice_quantities, initial=1, ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['quantity'].widget.attrs['class'] = 'quantity_of_item’ ◆cart_detail.html {% block main %} {% for item in items %} <table class=""> <tbody> <tr> <th>Quantity</th> <td> <form method="post" enctype="multipart/form-data"> {% csrf_token %} {% for field in cart_form %} <div class="">{{ field }}</div> <button class="" type="submit">Change</button> {% endfor %} </form> </td> </tr> </tbody> </table> {% endfor %} {% endblock %} 蟒蛇:3.9 姜戈:4.1