gpt4 book ai didi

Django在 View 中将表单添加到表单集

转载 作者:行者123 更新时间:2023-12-05 00:17:53 26 4
gpt4 key购买 nike

我陷入了一个设计问题。

想象一个订单模型和 Material 模型,

class Material(models.Model):
material_code = models.CharField(max_length=40)
standard_price = models.DecimalField()

class Order(models.Model):
customer = models.ForeignKey(Customer)


class OrderItems(models.Model):
order = models.ForeignKey(Order)
material = models.ForeignKey(Material)
price = models.DecimalField()

在我的订单详细信息 View 中,我使用 inlineformset_factory(Order, OrderItems) 填充订单项

我想要的行为如下:

如果用户想要添加更多订单项,我想将用户重定向到 Material 列表页面,用户选择一种或多种 Material 并确认,然后我将他重定向到新添加的项目的订单详细信息 View 。

我正在考虑这些工作,比如带有中间页面的 django 管理操作。

在向订单添加新订单项之前,我还想从 Material 标准价格设置订单项价格,这意味着我想在将其添加到订单项之前修改表单集值。

我想在这里问的问题是,是否有更简单的方法来实现这一点,似乎将表单集数据存储到 session 并用新项目重新填充表单集并不容易。我会考虑这个问题的另一种解决方案。

顺便说一下,我不想要 js 解决方案,想象一下我的订单模型上的一个字段,grandtotal,我可以计算总项目数量,使用 js 解决方案我可能必须用 js 做计算逻辑,用户添加一个项目并更改价格然后我用js做总计计算。这是我想要避免的。

最佳答案

从您提供的描述中,我没有找到表单集的用例。

您只需要一个列出 Material 的 Material 目录页面。每种 Material 都可以添加到当前购物车中,这是通过对沿 Material PK 传递的 url 的 Ajax 调用来完成的,因此该 Ajax 调用的 View 可以创建购物车并将该 Material 添加到购物车中。

最后,您需要一个 OrderDetail,您需要对当前在用户购物车中的所有 Material 进行循环。

您可以首先在数据库中完全实现它,为 Cart 定义关系模型,这实际上是您已经实现的 Order 类。

然后你可以添加一个缓存层来限制对数据库的写入/删除/更新,使用 django session (考虑到你不在数据库中存储 session ,这有性能提升!)

总而言之,您可能需要的是(我使用购物车的概念,暗示用户只能拥有一个事件订单,如果您的要求不同,则可以轻松更改为您提供的订单订购型号):

数据模型:

class Cart:
user = 1to1(User, related_name='cart') # Can be a FK if you want several active orders
is_approved = Boolean # To tell if the order is considered Over or is still open
created_at = DateTimeField
...

class Material:
orders = M2M(Cart, through=CartItem)
...

class CartItem:
cart = FK(Cart)
material = FK(Material)
...

浏览次数:
def list_materials(request):
returns_rendered_template_with(materials=Material.objects.all())

#Ajax method, called via Post, you probably need a way to also delete, or edit (number of materials to order ?)
def add_material_to_cart(request, material_id):
cart = Cart.objects.get_or_create(user=request.user)
material = Material.objects.get(pk=material_id)
CartItem(material=material, cart=cart).save()

def order_detail_view(request):
cart = user.cart
cart_items = CartItems.objects.filter(cart=cart)
returns_rendered_template_with(cart_items=cart_items)

模板:

Material list .html
....
{% for item in materials %}
{% show material info, such as price, availability, ... %}
<button data-pk={{item.pk}}, ...> to call add_material_to_cart </button>
{% endfor %}

order_detail.html
....
{% for item in cart_items %}
{% show each cart_item.material and its information + whatever you need %}
{% endfor %}

这是你可以实现的最基本的形式,我理解,你想要。
您可以将这些 View 中的几个合并在一起,您可以实现“完全 session ”解决方案,而无需 Cart 和 CartItem 模型,只需将最终订单持久化到我不知道的 Bill 模型中?订单历史 ?任何你想要的。

关于Django在 View 中将表单添加到表单集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39185573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com