Often one sees a pattern where one aims to update an
instance wrapped in a ModelForm
before
creating a record in the database. A programmer often
writes:
form = MyFormClass(request.POST, request.FILES)
if form.is_valid():
object = form.save(commit=False)
object.some_attribute = some_value
object.save()
Why is it a problem?
Because commit=False
does not only
result in not creating a record at the
database. It also has for example impact on many-to-many
fields in the form.
When you thus specify commit=False
, the
ManyToManyField
s of the model that are also
present in the form, are not stored in the database
either, since at that moment, no primary key for the
object exists yet.
One can of course implement the logic themselves, but
the idea of a ModelForm
is to remove as
much boilerplate code as possible.
What can be done to resolve the problem?
You alter the instance wrapped in the form before saving the form, so:
form = MyFormClass(request.POST, request.FILES)
if form.is_valid():
form.instance.some_attribute = some_value
form.save()
That way the form can still handle other tasks it
needs to carry out in the save
method, and
furthermore it is a more "clean"
implementation.