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

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

4b9b3361

Ответ 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='')
    ...