При создании плоской страницы я хочу, чтобы пользователь выбирал шаблон из предопределенного списка. Чтобы сохранить модель 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 нет, и, наконец, я делаю что-то взломанное?