【问题标题】:NOT NULL constraint failed:orders_order.user_idNOT NULL 约束失败:orders_order.user_id
【发布时间】:2022-01-19 13:34:47
【问题描述】:

我是 django 的新手,我正在建立一个电子商务网站。 当我尝试在我的网站上下新订单时,我收到了这个错误: NOT NULL 约束失败: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 %}

【问题讨论】:

  • 您在views.py 中分配了user,但从不使用它。是否应该传递给OrderCreateForm
  • @MadCowDisease 如何将其传递给表单?
  • 说起来容易做起来难,stackoverflow.com/questions/53955850/… 可以解决你的问题
  • 或者尝试将用户传递给表单保存功能:order = form.save(user=user)
  • @MadCowDisease 我收到了这个错误,我认为这不起作用 save() 得到了一个意外的关键字参数“用户”

标签: python django web django-models django-views


【解决方案1】:

OrderCreateForm 用于创建订单,但您没有指定用户字段,因此您应该在将用户对象保存到 views.py 之前将其添加到 Order 当您调用 form.save() 时,它会尝试创建 Order 对象,但该订单没有用户,这就是您得到 NOT NULL 约束失败的原因:orders_order.user_id

【讨论】:

  • 你能解释的更具体点吗?
  • 所以你的views.py中有这行代码: order = form.save() 那么你需要像这样添加request.user到order:order.user = request.user 然后order.save() 尝试添加这些,如果您有任何问题,请告诉我
【解决方案2】:

问题已解决: 在views.py中应该是这样的:

order = form.save(commit=False)
order.user = request.user
order.save()

【讨论】:

猜你喜欢
  • 2015-04-22
  • 2018-08-24
  • 2021-11-16
  • 2020-12-18
  • 2021-03-20
  • 2020-02-11
  • 2019-02-13
  • 2017-12-31
  • 2019-05-06
相关资源
最近更新 更多