Как изменить неизмененную модель администратора inlines?
Своего рода дубликат обоих:
- Как принудительно сохранить "пустой"/измененный инлайн-объект django admin?
- Как принудительно создать неизменный объект инлайн админки django в django 1.9
Но мне все еще интересно, есть ли лучший способ сделать это в последующих обновлениях Django?
Я задался целью модифицировать свои инлайн-объекты в стеке model admin (до или после сохранения, не имеет значения) при изменении родительского экземпляра model admin. Я попробовал переопределить save_formset
и save_related
в классе model admin, как написано в документации Django здесь и здесь, используя commit=False
. Например:
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
instance.any_field = "value"
instance.save()
Метод formset.save(commit=False)
возвращает инлайн-объекты формы, только если они изменены на панели администратора Django, как указано в django docs, но он не возвращает список инлайн-объектов, если они не изменены, даже после отправки commit=False
. Мне нужно отредактировать эти инлайн объекты независимо от того, были ли они изменены на панели администратора или нет.
Я не смог найти законный способ предварительной обработки этих неизменных инлайн-форм перед сохранением. Поэтому я решил сделать обработку после сохранения.
def save_formset(self, request, form, formset, change):
super().save_formset(request, form, formset, change)
forms = formset.forms
for form in forms:
obj = form.instance
# Do anything with obj
obj.save()