В Django, ModelAdmin, в чем разница между save_form() и save_formset()?
Может ли кто-нибудь объяснить различия и/или сходства между save_form и save_formset из ModelAdmin?
Единственное, что я смог найти об этом в исходном коде.
def save_form(self, request, form, change):
"""
Given a ModelForm return an unsaved instance. ``change`` is True if
the object is being changed, and False if it's being added.
"""
return form.save(commit=False)
def save_formset(self, request, form, formset, change):
"""
Given an inline formset save it to the database.
"""
formset.save()
А в документации есть только это о save_formset (https://docs.djangoproject.com/en/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset)
Методу save_formset передается HttpRequest, родительский ModelForm и булево значение, основанное на том, добавляет ли он или изменяет родительский объект.
А formset - это набор одинаковых форм. Например, если у вас есть форма, где пользователь вводит понравившееся ему блюдо, но затем вы хотите, чтобы пользователь мог продолжать добавлять другие, сколько захочет, то набор форм будет генерировать формы с вводом для блюда, и будет генерировать новые, пустые вводы, по мере роста списка. Когда вызывается formset.save(), все эти формы сохраняются, и именно это делает save_formset().
Как показано в примере в docs, вы можете переопределить это, например, чтобы добавить пользователя к каждой форме в наборе форм до фиксации изменений в базе данных:
class ArticleAdmin(admin.ModelAdmin):
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for obj in formset.deleted_objects:
obj.delete()
for instance in instances:
instance.user = request.user
instance.save()
formset.save_m2m()
Теперь, save_form(), это просто сохранение обычной формы, но, как вы можете видеть, у нее есть commit=False, так что форма еще не сохранена в базе данных. Данные могут быть добавлены в форму до тех пор, пока она не будет готова к фиксации в базе данных. Если форма основана на модели с ManyToManyField, то это поле не может быть сохранено до тех пор, пока экземпляр модели не будет сохранен первым, поэтому здесь используется form.save_m2m() в следующей функции в том же исходном коде :
def save_related(self, request, form, formsets, change):
"""
Given the ``HttpRequest``, the parent ``ModelForm`` instance, the
list of inline formsets and a boolean value based on whether the
parent is being added or changed, save the related objects to the
database. Note that at this point save_form() and save_model() have
already been called.
"""
form.save_m2m()
for formset in formsets:
self.save_formset(request, form, formset, change=change)
Примечание Я относительно новичок в наборе форм, и сам никогда не модифицировал и не использовал методы ModelAdmin, поэтому если кто-то увидит что-то неправильное в моем резюме, пожалуйста дайте мне знать.