NOT NULL 约束 failed:orders_order.user_id
NOT NULL constraint failed:orders_order.user_id
我是 django 的新手,我正在建立一个电子商务网站。
当我尝试在我的网站上下新订单时出现此错误:
NOT NULL 约束 failed:orders_order.user_id
每个用户可以有多个订单,我想在用户个人资料中显示订单,但我在下订单时遇到问题
models.py
class Order(models.Model):
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
address = models.CharField(max_length=250)
postal_code = models.CharField(max_length=11)
city = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
paid = models.BooleanField(default=False)
class Meta:
ordering = ('-created',)
def __str__(self):
return f'Order {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 str(self.id)
def get_cost(self):
return self.price * self.quantity
forms.py
class OrderCreateForm(forms.ModelForm):
class Meta:
model = Order
fields = ['address', 'postal_code', 'city']
views.py
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
user = request.user
form = OrderCreateForm(request.POST)
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'])
context = {
'order': order,
}
# clear the cart
cart.clear()
return render(request, 'order/created.html', context)
else:
form = OrderCreateForm()
context = {'cart': cart,
'form': form,
}
return render(request, 'order/create.html', context)
模板
{% extends 'shared/_MainLayout.html' %}
{% block content %}
<h1>Checkout</h1>
<div class="order-info">
<h3>Your order</h3>
<ul>
{% for item in cart %}
<li>
{{ item.quantity }}x {{ item.product.name }}
<span>${{ item.total_price }}</span>
</li>
{% endfor %}
</ul>
<p>Total: ${{ cart.get_total_price }}</p>
</div>
<form method="post" class="order-form">
{{ form.as_p }}
<p><input type="submit" value="Place order"></p>
{% csrf_token %}
</form>
{% endblock %}
OrderCreateForm 用于创建订单,但您没有指定用户字段,因此您应该在将用户对象保存到 views.py 之前将其添加到 Order
当您调用 form.save() 时,它会尝试创建 Order 对象,但该订单没有用户,这就是您获得 NOT NULL 约束的原因 failed:orders_order.user_id
问题已解决:
在 views.py 中应该是这样的:
order = form.save(commit=False)
order.user = request.user
order.save()
我是 django 的新手,我正在建立一个电子商务网站。 当我尝试在我的网站上下新订单时出现此错误: NOT NULL 约束 failed:orders_order.user_id
每个用户可以有多个订单,我想在用户个人资料中显示订单,但我在下订单时遇到问题
models.py
class Order(models.Model):
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
address = models.CharField(max_length=250)
postal_code = models.CharField(max_length=11)
city = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
paid = models.BooleanField(default=False)
class Meta:
ordering = ('-created',)
def __str__(self):
return f'Order {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 str(self.id)
def get_cost(self):
return self.price * self.quantity
forms.py
class OrderCreateForm(forms.ModelForm):
class Meta:
model = Order
fields = ['address', 'postal_code', 'city']
views.py
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
user = request.user
form = OrderCreateForm(request.POST)
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'])
context = {
'order': order,
}
# clear the cart
cart.clear()
return render(request, 'order/created.html', context)
else:
form = OrderCreateForm()
context = {'cart': cart,
'form': form,
}
return render(request, 'order/create.html', context)
模板
{% extends 'shared/_MainLayout.html' %}
{% block content %}
<h1>Checkout</h1>
<div class="order-info">
<h3>Your order</h3>
<ul>
{% for item in cart %}
<li>
{{ item.quantity }}x {{ item.product.name }}
<span>${{ item.total_price }}</span>
</li>
{% endfor %}
</ul>
<p>Total: ${{ cart.get_total_price }}</p>
</div>
<form method="post" class="order-form">
{{ form.as_p }}
<p><input type="submit" value="Place order"></p>
{% csrf_token %}
</form>
{% endblock %}
OrderCreateForm 用于创建订单,但您没有指定用户字段,因此您应该在将用户对象保存到 views.py 之前将其添加到 Order 当您调用 form.save() 时,它会尝试创建 Order 对象,但该订单没有用户,这就是您获得 NOT NULL 约束的原因 failed:orders_order.user_id
问题已解决: 在 views.py 中应该是这样的:
order = form.save(commit=False)
order.user = request.user
order.save()