#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)
...