Как принудительно сохранить «пустой» / неизменный админ django inline? - PullRequest
27 голосов
/ 07 сентября 2010

У меня есть несколько строк в одной из моих моделей администратора, которые имеют значения по умолчанию, которые, вероятно, не нужно будет изменять при добавлении нового экземпляра с помощью «Добавить еще один ...».К сожалению, django не распознает эти встроенные объекты как новые, если какое-либо значение не изменилось.Это заставляет меня добавить встроенное, изменить произвольное значение, сохранить, изменить значение обратно и сохранить еще раз, чтобы достичь желаемого эффекта.

Единственное решение, которое я до сих пор придумала, - это добавить скрытое«Измененное» поле, которое будет заполняться с помощью java-скрипта при добавлении нового inline.Поскольку это кажется очень хакерским, я надеюсь, что есть более элегантное решение.

Любые идеи будут высоко оценены.

Спасибо, Даниэль.

Ответы [ 2 ]

55 голосов
/ 17 сентября 2010

Мне потребовалось довольно много времени, чтобы понять, но на самом деле все очень просто.

from django.contrib import admin
from django.forms.models import BaseInlineFormSet, ModelForm

class AlwaysChangedModelForm(ModelForm):
    def has_changed(self):
        """ Should returns True if data differs from initial. 
        By always returning true even unchanged inlines will get validated and saved."""
        return True

class CheckerInline(admin.StackedInline):
    """ Base class for checker inlines """
    extra = 0
    form = AlwaysChangedModelForm
7 голосов
/ 21 апреля 2016

@ daniel ответ отличный, однако он попытается сохранить уже созданный экземпляр, если не было внесено никаких изменений, что не является необходимым, лучше использовать его как:

class AlwaysChangedModelForm(ModelForm):
    def has_changed(self, *args, **kwargs):
        if self.instance.pk is None:
            return True
        return super(AlwaysChangedModelForm, self).has_changed(*args, **kwargs)
...