Django, как удалить пустой выбор из поля выбора в modelform?
Я создал в нем модель с внешним ключом:
class Book(models.Model):
library = models.ForeignKey(Library, null=False, blank=False)
...
а затем я создал форму с ModelForm для отображения пользователям:
class BookSubmitForm(ModelForm):
class Meta:
model = Book
и когда я показываю страницу с формой, я получаю выбор библиотеки, но также и пустой (--------) выбор, который приходит по умолчанию.
Я подумал, что с помощью null = False и blank = False в модели, которая избавится от этого пустого выбора в ModelForm, но нет. Что я могу сделать, чтобы иметь только фактический выбор в списке, а не тот?
Ответы
Ответ 1
См. ModelChoiceField. Вы должны установить empty_label в None. Таким образом, ваш код будет выглядеть примерно так:
class BookSubmitForm(ModelForm):
library = ModelChoiceField(queryset=Library.objects, empty_label=None)
class Meta:
model = Book
EDIT: изменилось имя поля на нижний регистр
Ответ 2
Если вы используете ModelForm, вам не нужно указывать набор запросов, требуемый, ярлык и т.д. Но для ответа с повторением вы должны сделать это снова.
На самом деле вы можете сделать это, чтобы избежать повторного указания всего
class BookSubmitForm(ModelForm):
def __init__(self, *args, **kwargs):
super(BookSubmitForm, self).__init__(*args, **kwargs)
self.fields['library'].empty_label = None
class Meta:
model = Book
Ответ 3
self.fields['xxx'].empty_label = None
не работает Если тип поля TypedChoiceField
не имеет свойства empty_label
.
Что мы должны сделать, так это удалить первый выбор:
class BookSubmitForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(BookSubmitForm, self).__init__(*args, **kwargs)
for field_name in self.fields:
field = self.fields.get(field_name)
if field and isinstance(field , forms.TypedChoiceField):
field.choices = field.choices[1:]
Ответ 4
Если вы укажете blank=False
и default=<VALUE>
в определении поля модели, то Django по умолчанию не сделает пустой выбор; обратите внимание, что значение по умолчанию может быть неверным выбором и, например, установить ''
или любой invalid choice
.
class Book(models.Model):
library = models.ForeignKey(Library, null=False, blank=False, default='')
...