﻿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	closed	Forms	1.9	Normal	invalid	formset inline_formset inline_formsetfactory		Accepted	0	0	0	0	0	0
