【问题标题】:Django view problem - Cannot assign "<SimpleLazyObject: <User: admin>>":Django 视图问题 - 无法分配“<SimpleLazyObject: <User: admin>>”:
【发布时间】:2019-03-18 15:06:27
【问题描述】:

我的Django 应用程序的订单视图有问题。

整个错误:

Value Error: Cannot assign "SimpleLazyObject: User: wad2": "OrderItem.order"    
must be a "Order" instance.

这是订单视图:

@login_required
def my_order(request):
    user = request.user
    context = {}
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST or None, instance=user)
        if form.is_valid():
            order = form.save()
            for item in cart:
                OrderItem.objects.create(
                    order=order,
                    product=item['product'],
                    price=item['price'],
                    quantity=item['quantity'])
            cart.clear()
            context['order'] = order
    else:
        form = OrderCreateForm()
        context['form']=form
    return render(request, 'iFood/my-order.html', context)

形式:

class OrderCreateForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ('created’,)

OrderItemOrder 的模型:

class Order(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT, related_name='orders')  
    created = models.DateField(default=datetime.date.today())
    def __str__(self):
            return 'Order {}'.format(self.id)

    def get_total_cost(self):
            return sum(item.get_cost() for item in self.items.all())


class OrderItem(models.Model):
        order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE)
        product = models.ForeignKey(Product, related_name='order_items', on_delete=models.CASCADE)
        price = models.DecimalField(max_digits=10, decimal_places=2)
        quantity = models.PositiveIntegerField(default=1)
        def __str__(self):
            return '{}'.format(self.id)

        def get_cost(self):
            return self.price * self.quantity

我使用表单的原因只是为了确认用户想要创建订单。我知道我创建 OrderItem 和参考顺序的方式有问题,但我不知道如何解决。

【问题讨论】:

    标签: python django django-forms python-3.7


    【解决方案1】:

    当您想要编辑现有实例时,您可以在模型表单中使用instance。如果模型表单是Order,那么实例必须是订单。您正在传递一个 User 实例,因此您会收到错误消息。

    在您的情况下,您正在创建一个新订单,因此您不必传递实例。可以用commit=False保存表单,然后设置用户:

    if request.method == 'POST':
        form = OrderCreateForm(request.POST or None)
        if form.is_valid():
            order = form.save(commit=False)
            order.user = request.user
            order.save()
            ...
    

    由于您没有让用户填写表单中的任何字段,因此您可以完全摆脱表单。您仍然可以检查request.method,这样您就只会为POST 请求创建订单。

    if request.method == 'POST':
        order = Order.objects.create(user=request.user)
        ...
    

    【讨论】:

      猜你喜欢
      • 2019-07-19
      • 1970-01-01
      • 2023-03-09
      • 2016-12-11
      • 2013-07-11
      • 1970-01-01
      • 2015-01-05
      • 2015-09-13
      • 1970-01-01
      相关资源
      最近更新 更多