Я использую StackedInline для заполнения OneToOneField, но хочу сделать его необязательным, поэтому устанавливаю min_num=0 и extra = 0.
Я также хочу включить значения по умолчанию, когда пользователь нажимает кнопку «➕ Добавить еще».
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
kwargs['initial'] = {'hello': 'world'}
class MyInline(admin.StackedInline):
form = MyForm
extra = 0
min_num=0
Это работает. Когда кто-то нажимает кнопку «➕ Добавить еще», поле hello заполняется world.
Я также хочу выполнить некоторую пользовательскую проверку, поэтому похоже, что мне нужно использовать BaseInlineFormSet. Я переместил исходный материал в MyFormSet.__init__
class MyFormSet(BaseInlineFormSet):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if not self.forms:
return
self.forms[0].fields['hello'].initial = 'world'
def clean(self):
# My custom validation
class MyInline(admin.StackedInline):
formset = MyFormSet
extra = 0
min_num=0
Но начальные значения больше не заполняются, когда пользователь нажимает кнопку «➕ Добавить еще», а только тогда, когда форма изначально отображается с extra = 1.
Есть ли что-то еще, что мне нужно сделать в MyFormSet, чтобы сохранить поведение MyForm?
Вы не можете попытаться установить свойство initial в __init__ вашего набора форм, поскольку self.forms[0] на тот момент даже не существует. Правильное место для этого (как в вашем первом) пример, в методе инициализации вашего MyForm.
Что вы можете сделать, так это использовать MyFormSet для реализации своей пользовательской проверки с помощью clean и использовать MyForm для добавления логики о значениях по умолчанию, а затем:
from django.forms import formset_factory
class MyInline(admin.StackedInline):
form = Myform
formset = MyFormSet
extra = 0
min_num=0
О верно. Есть ли причина использовать такую старую версию? Не знаю, что изменилось с 1.11. Будет намного проще получить поддержку в целом с более последней версией.
@frank, похоже, на самом деле все еще проще. Я обновил свой ответ.
О, идеально! Я даже не думал использовать оба параметра одновременно :D
И я не делал этого, пока не взглянул на то, что происходит под капотом, self.form передается на фабрику форм, а также self.formset.
Спасибо за быстрый ответ! У меня не работает, к сожалению. Все еще не получаю значения по умолчанию с помощью кнопки. Я использую Django 1.11, если это что-то меняет.