Django, как обрабатывать две формы с отношениями «один ко многим» между моделями в одном посте - PullRequest
0 голосов
/ 24 октября 2018

Для простоты, вот краткая версия вопроса, с которым я имею дело.Скажем, у вас есть две модели, 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.

Итак, мой вопрос заключается в том, как прикрепить родительский экземпляр.(продукт) для дочернего экземпляра (определение цены продукта) в том же методе публикации (т. е. не создание цены продукта на другой странице)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...