Django, как убрать пустой выбор из поля выбора в модели? - PullRequest
28 голосов
/ 10 января 2012

Я создал модель с внешним ключом:

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

Ответы [ 4 ]

36 голосов
/ 10 января 2012

См. ModelChoiceField .Вы должны установить empty_label на None.Таким образом, ваш код будет выглядеть примерно так:

class BookSubmitForm(ModelForm):
    library = ModelChoiceField(queryset=Library.objects, empty_label=None)

    class Meta:
        model = Book    

РЕДАКТИРОВАТЬ: изменил имя поля в нижний регистр

11 голосов
/ 24 мая 2015

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:]
10 голосов
/ 03 апреля 2015

Если вы используете 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 
7 голосов
/ 04 июня 2013

Если вы укажете blank=False и default=<VALUE> в определении поля модели, то Django не будет отображать пустой выбор по умолчанию;обратите внимание, что значение по умолчанию может быть недопустимым и может быть установлено '' или любым invalid choice, например.

class Book(models.Model):
    library = models.ForeignKey(Library, null=False, blank=False, default='')
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...