Проблема с представлением Django — не удается назначить «<SimpleLazyObject: >»:

#python #django #django-forms #python-3.7

#python #django #django-формы #python-3.7

Вопрос:

У меня проблема с порядковым представлением моего приложения на 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’,)
  

Модели для OrderItem и Order :

 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 и ссылаюсь на порядок там, но я не знаю, как это решить.

Ответ №1:

Вы используете instance в форме модели, когда хотите отредактировать существующий экземпляр. Если форма модели предназначена для Order , то экземпляр должен быть 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)
    ...