При создании плоской страницы я хочу, чтобы пользователь выбирал шаблон из предопределенного списка. Чтобы сохранить модель Flatpage
нетронутой, я предпочитаю ChoiceField
над ModelChoiceField
(последний предоставляет PK шаблона, но мне нужно имя для поля template_name):
class NewFlatpageForm(FlatpageForm):
template_name = forms.ChoiceField(choices = [])
def __init__(self, *args, **kwargs):
self.base_fields['template_name'].choices = ProjectTemplate.objects.values_list('path', 'name')
super(NewFlatpageForm, self).__init__(*args, **kwargs)
Я переопределяю __init__
или Django заполняет варианты при запуске сервера и не обновляет список.
У меня нет никакого администрирования, но я делал подобные вещи, используя атрибут fields
, когда не использовал admin. Однако в этом случае я получил исключение, говорящее, что fields
не является атрибутом формы. __dict__
показал мне атрибут base_fields
, и его использование работает. Итак, зачем использовать base_fields здесь, и почему fields
нет, и, наконец, я делаю что-то взломанное?