Подтвердить что ты не робот

Как принудительно сохранить "пустой" /неизменный django admin inline?

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

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

Будем очень благодарны за любые идеи.

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

4b9b3361

Ответ 1

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

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

Ответ 2

@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)