M2M关系船:无法保存到直通模型

M2M relation ship : Can't save to the through model

我有一个订单模型,它与产品模型处于 m2m 关系,当我创建订单并检查我的数据库后,我可以看到订单已保存但不在直通模型中

models.py

from inventory.models import Product
from user.models import User

class Order(models.Model):
    product = models.ManyToManyField(Product, through='OrderItems' )
    vendeur = models.ForeignKey(User, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField()

class Customer(models.Model):
    full_name = models.CharField(max_length=60, verbose_name='full name')
    address = models.CharField(max_length=255)
    phone = models.CharField(max_length=20)
    city = models.CharField(max_length=30) 

class OrderItems(models.Model):
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
    order = models.ForeignKey(Order,on_delete=models.CASCADE)    
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True)

views.py

@login_required
def add_order(request):
    if request.method == 'POST':
        form = NewOrderForm(request.POST)
        if form.is_valid():
            order = form.save(commit=False)
            order.vendeur = request.user
            order.save()        
            return redirect('dashboard-index', )
    else : 
        form = NewOrderForm()
    return render(request, 'dashboard/add_order.html', {'form': form})

forms.py

class NewOrderForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ('product','quantity')

如果您使用save(commit=False),则需要调用save_m2m()。 因为您的表单有 m2m field

参考documentions

@login_required
    def add_order(request):
        if request.method == 'POST':
            form = NewOrderForm(request.POST)
            if form.is_valid():
                order = form.save(commit=False)
                order.vendeur = request.user
                order.save()
                form.save_m2m()        
                return redirect('dashboard-index', )
        else : 
            form = NewOrderForm()
        return render(request, 'dashboard/add_order.html', {'form': form})