Подтвердить что ты не робот

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`...

4b9b3361

Ответ 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