Мне удалось обойти проблему (похоже), но я создал три отдельных действия (требуется книга, требуется книга + требуется глава, требуется книга + требуется глава + требуется стих).
Затем мне просто нужно было дублировать мой action-endpoint
, чтобы одна и та же конечная точка могла принять все три действия.
Хотя я вижу ценность «исторических данных» в некоторых случаях, похоже, должен быть способ их игнорировать.
Вам необходимо создать пользовательскую форму и шаблон для LinkSectionInline
.
Что-то вроде этого должно работать для форма:
LinkFormset = forms.modelformset_factory(Link)
class LinkSectionForm(forms.ModelForm):
def __init__(self, **kwargs):
super(LinkSectionForm, self).__init__(**kwargs)
self.link_formset = LinkFormset(instance=self.instance,
data=self.data or None,
prefix=self.prefix)
def is_valid(self):
return (super(LinkSectionForm, self).is_valid() and
self.link_formset.is_valid())
def save(self, commit=True):
# Supporting commit=False is another can of worms. No use dealing
# it before it's needed. (YAGNI)
assert commit == True
res = super(LinkSectionForm, self).save(commit=commit)
self.link_formset.save()
return res
(Это просто пришло мне в голову и не тестировалось, но должно помочь вам двигаться в правильном направлении.)
Ваш шаблон просто должен правильно отображать форму и form.link_formset .
Моя рекомендация состояла бы в том, чтобы на самом деле изменить Вашу модель. Почему бы не a ForeignKey
в Link
кому: LinkSection
? Или, если это не OneToMany, возможно, a ManyToMany
поле? Администраторский интерфейс генерирует это бесплатно. Конечно, я не рекомендую это, если ссылки логически не имеют никакого отношения к разделам ссылки, но возможно они делают? Если они не делают, объясните, какова намеченная организация. (Например, 3 ссылки на раздел, зафиксированный или произвольный?)
Вы можете создать новый класс, аналогичный TabularInline или StackedInline, который может сам использовать встроенные поля.
В качестве альтернативы вы можете создать новые шаблоны администрирования специально для вашей модели. Но это, конечно же, отменяет изящные функции интерфейса администратора.