ModelChoiceField, удалив пустой выбор
Я хочу избавиться от выбора "-------------". Django добавляет в выбранный ввод, представляющий внешний ключ в ModelForm.
Он ответил , что вы можете использовать параметр empty_label=none
, но у меня есть ModelForm, а не регулярная форма и переопределение поля не допускается.
Я знаю, что я могу переопределить метод __init__()
ModelForm, чтобы изменить выборки ModelChoiceField с помощью
self.fields['my_foreign_key'].queryset = ....
Но это было бы очень уродливо, так как это происходит над +10 foreign_keys в модели "Main", и там больше, чем Modelform, основанный на этой модели
Весь контекст:
- каждая из этих foreign_key указывает на такие же модели: они представляют собой определенные списки вариантов, многие модели облегчают их модификацию через администратора.
- все эти модели связаны с основной моделью с помощью отношения "to_field = code", основанного на Charfield, который содержит трехбуквенный код (эй, а не моя ошибка, мне пришлось использовать устаревшую базу данных MS Access) этот CharField имеет параметры
blank=True, unique=True
, поэтому я мог бы для каждого списка создать запись "---No information yet---"
, которая, вы ставите, пустое значение вместо трехбуквенного кода...
Ситуация сейчас: я получаю поле ввода выбора с двумя вариантами "пустого значения": один из джанго и мой, один за другим.
Я просто пропустил здесь параметр 'empty_label = none`...
Ответы
Ответ 1
Если вы хотите удалить пустой выбор для всех ModelChoiceField
, вы можете сделать что-то вроде.
class Form(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(Form, self).__init__(*args, **kwargs)
modelchoicefields = [field for field_name, field in self.fields.iteritems() if
isinstance(field, forms.ModelChoiceField)]
for field in modelchoicefield:
field.empty_label = None
Но это заменит все ModelChoiceField
s, поэтому может быть что-то более мелкое, например:
for fieldname in ('field1','field2','field3','field4','field5','field6'):
self.fields[fieldname].empty_label = None
Конечно, проще, чем __init__
переписать вы упомянули!
Обновление от Moritz
Вы можете использовать 2017 + использование:
forms.ModelChoiceField(... empty_label=None