Django - CheckboxSelectMultiple без ------ выбора

Как я могу удалить "------" из отображаемых вариантов? Я использую в своей форме модели:

widgets = {
    'event_form': forms.CheckboxSelectMultiple(),
}

В модели у меня есть IntegerField с выбором:

EVENT_FORM_CHOICES = (
    (1, _(u'aaaa')),
    (2, _(u'bbbb')),
    (3, _(cccc')),
    (4, _(u'dddd')),
    (5, _(eeee'))
)

отображаемые варианты содержат --------- в качестве первого возможного выбора. Как я могу избавиться от него?

РЕДАКТИРОВАТЬ: единственный рабочий способ, который я понял, это (в методе init):

tmp_choices = self.fields['event_form'].choices
del tmp_choices[0]
self.fields['event_form'].choices = tmp_choices

но это не очень элегантный способ :)


person tunarob    schedule 29.02.2012    source источник
comment
Как выглядит ваше поле event_form в вашей модели?   -  person Alasdair    schedule 29.02.2012
comment
@Аласдер event_form = models.PositiveSmallIntegerField(max_length=2, choices=EVENT_FORM_CHOICES)   -  person tunarob    schedule 29.02.2012
comment
Смотрите мой ответ ниже. Кроме того, я не думаю, что max_length=2 имеет смысл для IntegerField.   -  person Alasdair    schedule 01.03.2012


Ответы (3)


Django включает пустой выбор, потому что поле не имеет значения по умолчанию.

Если вы установите значение по умолчанию в своей модели, Django не будет включать пустой вариант.

class MyModel(models.Model):
    event_form = models.PositiveSmallIntegerField(choices=EVENT_FORM_CHOICES, default=1)

Если вы не хотите устанавливать значение по умолчанию в своей модели, вы можете явно объявить поле и варианты выбора в форме модели или изменить варианты выбора в методе __init__ формы модели.

person Alasdair    schedule 29.02.2012

Обновлять

аналогичный пример может быть полезен:

country = ModelChoiceField(reference_class = Country, choices= country_choices, 
required=True, empty_label=None,  widget=forms.Select)

Если вместо этого вам нужна клиентская сторона решения:

<script>     
$("#selectBox option[value='-----']").remove(); 
</script>
person asdf_enel_hak    schedule 29.02.2012
comment
инициал: Нет - это правильно вставлено? Я получаю сообщение об ошибке "начальное" не определено. - person tunarob; 29.02.2012
comment
Нет, это дает мне ошибку: __init__() получил неожиданный аргумент ключевого слова "начальный" - person tunarob; 29.02.2012

Я столкнулся с похожей проблемой, но решил ее таким образом. Сначала загрузите и установите https://pypi.python.org/pypi/django-multiselectfield. Если вы не знаете, как установить, посмотрите здесь: django-multiselectfield не может установить . Затем в models.py:

from multiselectfield import MultiSelectField

CHOICES_FOR_ITEM_WITH_CHOICES = (
            ("choice 1", "choice 1"),
            ("choice 2", "choice 2"),
            ("choice 3", "choice 3"),
        )
class MyModel(models.Model):
        item_with_choices = MultiSelectField(max_length=MAX_LENGTH, null=True, blank=True)

В admin.py:

from .forms import MyModelForm
class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm

    list_display = ('item_with_choices',)
    list_filter = ('item_with_choices',)
    search_fields = ('item_with_choices',)

admin.site.register(MyModel, MyModelAdmin)

В forms.py (вы можете назвать это как хотите):

from .models import MyModel

class MyModelForm(ModelForm):

    class Meta:
        model = MyModel
        fields = (
            'item_with_choices',
            )

    def clean(self):
        # do something that validates your data
        return self.cleaned_data

Это основано на ответе здесь: Django Model MultipleChoice

person guitarical    schedule 30.09.2015