Я хочу обновить Meta.fields
динамично. Действительно ли возможно сделать это от конструктора Form? Я попробовал следующее, но year
не обнаруживается во время поколения формы. Только name
и title
отображены.
class Author(models.Model):
name = ...
title = ...
year = ...
class PartialAuthorForm(ModelForm):
class Meta:
model = Author
fields = ('name', 'title')
def __init__(self, *args, **kwargs):
self.Meta.fields += ('year',)
Нет, это не сработает. Мета анализируется - что удивительно - метаклассом еще до того, как вы дойдете до __ init __
.
Для этого нужно вручную добавить поле в self.fields
:
def __init__(self, *args, **kwargs):
super(PartialAuthorForm, self).__init__(*args, **kwargs)
self.fields['year'] = forms.CharField(whatever)
Внутренний класс Meta
уже обрабатывается, когда класс ModelForm создается через метакласс, то есть ДО создания экземпляра. Выполнение того, что вы пытались сделать в __ init __
, не будет работать так!
Вы можете получить доступ к созданным объектам полей в словаре self.fields
, например. вы можете сделать что-то вроде self.fields ['year'] = forms.MyFormField (...)
.