Django Форма с зависимыми формами ForeignKey на одной странице
Добрый день, я пытаюсь реализовать django с зависимыми foreignkey формами на одной странице. У меня есть три moodel Store, Product и ProductClothing. Все они связаны с ForeignKey соответственно. Пользователи создают свой магазин отдельно и перенаправляются на страницу детализации магазина, где им нужно загрузить продукты. Но на этот раз я хочу, чтобы они загружали сразу и продукты, и одежду. Ниже приведены мои models.py и views.py того, что я имею в настоящее время на странице детального просмотра магазина. Также я получаю следующую ошибку:
error.py
NOT NULL constraint failed: product_productclothing.product_id
models.py
class Store(models.Model):
owner = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
name = models.CharField(max_length=100, unique=True)
slug = AutoSlugField(populate_from='name', unique=True)
description = models.CharField(max_length=255, blank=True)
def __str__(self):
return self.name
class Product(models.Model):
store = models.ForeignKey(Store, null=True, on_delete=models.SET_NULL)
owner = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
title = models.CharField(max_length=255)
price = models.DecimalField(max_digits=9, decimal_places=2, verbose_name=_("Regular price"))
class ProductClothing(models.Model):
CLOTHING_GENDER_CHOICES = (
('M', 'Male',),
('F', 'Female',),
('U', 'Unisex',),
)
CLOTHING_TYPE_CHOICES = (
('dress', 'Dresses',),
('fabric', 'Fabrics',),
('shirt', 'Shirts',),
('suit', 'Suits',),
('tshirt', 'T-Shirts',),
('base_layers', 'Base_Layers',),
('blazer', 'Blazers',),
)
product = models.OneToOneField(Product, on_delete=models.CASCADE)
gender = models.CharField(max_length=10, choices=CLOTHING_GENDER_CHOICES, blank=True, null=True)
clothing_type = models.CharField(max_length=255, choices=CLOTHING_TYPE_CHOICES, blank=True, null=True)
def __str__(self):
return self.product.title
views.py
@login_required
def store_dashboard_view(request, slug):
store = get_object_or_404(Store, slug=slug)
new_product = None
product_clothing = None
if request.user.profile == store.owner:
if request.method == 'GET':
product_form = ProductForm()
product_clothing_form = ProductClothingForm()
if request.method == 'POST':
product_form = ProductForm(data=request.POST)
product_clothing_form = ProductClothingForm(data=request.POST)
if product_form.is_valid() and product_clothing_form.is_valid():
new_product = product_form.save(commit=False)
product_clothing_form.save(commit=False)
new_product.store = store
new_product.owner = request.user.profile
product = product_form.save()
product = product
product_clothing_form.product = product
product_clothing_form.save()
print(request.user.first_name)
return redirect('/')
context = {
"object":store,
"form": product_form,
"product_clothing_form": product_clothing_form
}
return render(request, "store/store-dashboard.html", context)
else:
return redirect('store:store-detail-view', slug=store.slug)
Попробуйте изменить эту часть
if product_form.is_valid() and product_clothing_form.is_valid():
new_product = product_form.save(commit=False)
product_clothing_form.save(commit=False)
new_product.store = store
new_product.owner = request.user.profile
product = product_form.save()
product = product
product_clothing_form.product = product
product_clothing_form.save()
print(request.user.first_name)
return redirect('/')
to
if product_form.is_valid() and product_clothing_form.is_valid():
new_product = product_form.save(commit=False)
product_clothing_form = product_clothing_form.save(commit=False)
new_product.store = store
new_product.owner = request.user.profile
new_product.save() #this is correct your mistake was here
print(new_product)
product_clothing_form.product = new_product
product_clothing_form.save()
print(request.user.first_name)
return redirect('/')