Для простоты, вот краткая версия вопроса, с которым я имею дело.Скажем, у вас есть две модели, Product и ProductPricing, где Product имеет много экземпляров ProductPricing, а цены на продукты связаны только с одним продуктом (отношение один ко многим).Чистый метод модели:
models.py:
class ProductPricing(models.Model):
product = models.ForeignKey(Product, related_name = 'prices', verbose_name = 'Price', blank = True, null = True)
customer = models.ForeignKey(Customer, related_name = 'customer_pricings', blank = True, null = True)
...
def clean(self):
if not self.product and not self.customer:
raise ValidationError(_('Pricing requires either a product or a customer. None is provided') )
forms.py:
class ProductPricingAddonForm(ModelForm):
class Meta:
model = ProductPricing
fields = ['UOM', 'cost_per_UOM', 'product']
Теперь, в моем UpdateView, я делаю что-то вроде этого:
class UpdateProductView(View):
template_name = 'product.html'
product_form = ProductForm
pricing_form = ProductPricingAddonForm
def get(self, request, *args, **kwargs):
product_id = kwargs.get('pk', None)
product = Product.objects.get(id = product_id)
product_form = self.product_form()
pricing_form = self.pricing_form()
c = {}
c['product_form'] = product_form
c['pricing_form'] = pricing_form
return render(request, self.template_name, c)
def post(self, request, *args, **kwargs):
''' To update both the models in one go'''
product_id = kwargs.get('pk', None)
product = Product.objects.get(id = product_id)
product_pricing = ProductPricing.objects.filter(product = product)
product_form = self.product_form(request.POST if any(request.POST) else None, request.FILES or None, instance = product)
if product_form.is_valid():
product_form.save()
product_form_validity_flag = True
updated_product = Product.objects.get(id = product_id)
else:
product_form_errors = product_form.errors
...
# if no existing pricing specified for the product:
pricing_form = self.pricing_form(request.POST if any(request.POST) else None, request.FILES or None)
# Since a productpricing instance is required to have product or customer, the updated_product should somehow be attached to the form:
pricing_form['product'] = updated_product # <-- Error here
if pricing_form.is_valid():
pricing_form.save()
pricing_form_validity_flag
else:
pricing_form_errors = pricing_form.errors
if product_form_validity_flag and pricing_form_validity_flag:
return reverse(...)
else:
c = {'product_form': product_form,
'pricing_form': pricing_form }
return render(request, self.template_name, c)
Проблема при отправке формы, я получаю сообщение об ошибке, что объект «ProductPricingAddonForm» не поддерживает назначение элемента.Обратите внимание, что если я не предоставлю продукт как-либо в форме определения цены продукта, мне будет выдана ошибка проверки, определенная в методе clean модели ProductPricing.
Итак, мой вопрос заключается в том, как прикрепить родительский экземпляр.(продукт) для дочернего экземпляра (определение цены продукта) в том же методе публикации (т. е. не создание цены продукта на другой странице)?