Ниже приведен упрощенный пример того, чего я пытаюсь достичь:
class Product(models.Model):
# some data, does not really matter
class ProductAttributeValue(models.Model):
product = models.ForeignKey('Product')
value=models.CharField(_("value"),max_length=100)
....
class ProductForm(forms.ModelForm):
def __init__(self,*args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs)
#Here, I am dynamically constructing and injecting attributes.
#my products have dynamic attributes
# the filled-in values of these attributes need to be saved as ProductAttributeValue instances
#...
def save(commit):
m = super(ProductForm, self).save(commit=False)
#looping thru my custom attributes and constructing instances
#to simplify I will just put one example
attr_val=ProductAttributeValue(product=m)
attr_val.value=self.clean_data['myval']
m.productattributevalue_set.add(attr_val)
if commit:
m.save()
# also doing m2m_save if exists
return m
Так что, как я и ожидал, это завершится неудачно с product_id = None error. Я также попытался понять, как работает InlineForm (на стороне администратора) в django, но, похоже, они сначала сохраняют основной продукт, а затем ProductAttributeValue, и, если, скажем, сохранение ProductAttributeValue не удается, все в порядке.
Для моего случая это неприемлемо, то есть я должен сохранить всю форму (как продукт, так и стоимость) или потерпеть неудачу. Конечно, я могу сохранить с помощью commit = True с самого начала, но, как я уже сказал, я не хочу, чтобы продукт сохранялся, а значение не было.
Любая помощь приветствуется.