Как принудительно сохранить "пустой" /неизменный django admin inline?
У меня есть несколько строк в одной из моих моделей админов, которые имеют значения по умолчанию, которые, вероятно, не нужно будет менять при добавлении нового экземпляра с помощью "Добавить еще...". К сожалению, django не будет распознавать эти inline как новые объекты, если какое-то значение не изменилось. Это заставляет меня добавить строку, изменить произвольное значение, сохранить, изменить значение обратно и снова сохранить его, чтобы достичь желаемого эффекта.
Единственное решение, к которому я придумал, - добавить скрытое "измененное" поле, которое будет заполнено через java- script при добавлении новой строки. Поскольку это кажется очень хакерским, я надеюсь, что есть более элегантное решение.
Будем очень благодарны за любые идеи.
Спасибо, Даниэль.
Ответы
Ответ 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)