Обновление: Начиная с Django 1.9, в классе BaseFormSet
есть метод def get_form_kwargs(self, index)
.Следовательно, переопределение, которое передает данные в форму.
Это будет версия Python 3 / Django 1.9+:
class MyFormSet(BaseInlineFormSet):
def get_form_kwargs(self, index):
kwargs = super().get_form_kwargs(index)
kwargs['parent_object'] = self.instance
return kwargs
class MyForm(forms.ModelForm):
def __init__(self, *args, parent_object, **kwargs):
self.parent_object = parent_object
super(MyForm, self).__init__(*args, **kwargs)
class MyChildInline(admin.TabularInline):
formset = MyFormSet
form = MyForm
Для Django 1.8 и ниже:
Чтобы передать значение набора форм отдельным формам, вы должны увидеть, как они создаются.Редактор / IDE с «переходом к определению» действительно помогает здесь погрузиться в код ModelAdmin
и узнать о inlineformset_factory
и его BaseInlineFormSet
классе.
Оттуда вы обнаружите, чтоФорма создана в _construct_form()
, и вы можете переопределить ее для передачи дополнительных параметров.Вероятно, это будет выглядеть примерно так:
class MyFormSet(BaseInlineFormSet):
def _construct_form(self, i, **kwargs):
kwargs['parent_object'] = self.instance
return super(MyFormSet, self)._construct_form(i, **kwargs)
@property
def empty_form(self):
form = self.form(
auto_id=self.auto_id,
prefix=self.add_prefix('__prefix__'),
empty_permitted=True,
parent_object=self.instance,
)
self.add_fields(form, None)
return form
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.parent_object = kwargs.pop('parent_object', None)
super(MyForm, self).__init__(*args, **kwargs)
class MyChildInline(admin.TabularInline):
formset = MyFormSet
form = MyForm
Да, это включает в себя приватную _construct_form
функцию.
update Примечание: это не распространяется на empty_form
, следовательно, ваш код формы должен принимать параметры по выбору.