﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
27560	Formset.save() crashes for model with foreign key to concrete base model	Lorenzo Peña	nobody	"Model hierharchy

{{{
class ConcreteBase(models.Model):
    ...


class Descendant(ConcreteBase):
    ...
}}}

Master / Detail type models (e.g. Order and OrderDetail)

{{{
class MasterModel(models.Model):
    ...


class DetailModel(models.Model):
    
    master = models.ForeignKey(MasterModel, ...)
    concrete_base = models.ForeignKey(ConcreteBase, ...)
}}}

Form definition

{{{
class MasterModelForm(forms.ModelForm):
    ...


class DetailModelForm(forms.ModelForm):
    ...
    # master excluded from fields as will be manually added in view
    ...
}}}

Formset definition

{{{
DetailModelFormset = inlineformset_factory(MasterModel, DetailModel, form=DetailModelForm)
}}}

View definition

{{{
from django.views.generic.edit import CreateView #### <---- the error only happens on create view of MasterModel

class MasterModelAdd(CreateView):
    model = MasterModel
    form_class = MasterModelForm
    ...

    def form_valid(self, form):
        master_instance = form.save()
        detail_formset = DetailModelFormset()(self.request.POST)
        detail_instances = detail_formset.save(commit=False) ### <------ this line raises the error
        for detail_instance in detail_instances: ### <----- it never gets here
            detail_instance.master = master_instance
            detail_instance.save()

}}}

When calling formset.save() I'm getting an error from django/forms/models.py (line 910) regardless of the value of commit passed.

{{{
910:   pk_value = getattr(self.instance, self.fk.remote_field.field_name)
911:   setattr(obj, self.fk.get_attname(), getattr(pk_value, 'pk', pk_value))
}}}

The getattr call fails

if I wrap both lines in: {{{ if hasattr(self.instance, self.fk.remote_field.field_name): }}}
it works good.

Not sure if the condition is the way to fix the bug or it's just preventing the original cause from happening."	Bug	new	Forms	1.9	Normal		formset inline_formset inline_formsetfactory		Unreviewed	0	0	0	0	0	0
