ChoiceField не отображает пустую маркировку при использовании кортежа

Больше перезаписи стиля Ruby версия Ruby Hal:

class String
  def palindrome?
    (test = gsub(/[^A-Za-z]/, '').downcase) == test.reverse
  end
end

Теперь можно звонить palindrome? на любой строке.

41
задан Anupam 7 June 2017 в 12:19
поделиться

3 ответа

Я ' Мы нашли решение, которое работает так, как я хочу, без нарушения принципа DRY. Не очень чисто, но, полагаю, придется.

Согласно , в документации варианты выбора не обязательно должны быть кортежами:

Наконец, обратите внимание, что варианты могут быть любыми итерируемый объект - не обязательно список или кортеж. Это позволяет вам построить выбор динамически. Но если ты найдешь вы взламываете выбор быть динамичный, тебе, наверное, лучше используя правильную таблицу базы данных с Внешний ключ. выбор предназначен для статические данные, которые не сильно меняются, если когда-либо.

Итак, решение, которое я выберу на данный момент:

COMPETITION_TYPE_CHOICES = [
     (1, 'Olympic Games'),
     (2, 'ISU Championships'),
     (3, 'Grand Prix Series'),
]

COMP_TYPE_CHOICES_AND_EMPTY = [('','All')] + COMPETITION_TYPE_CHOICES

А затем:

class CompetitionSearchForm(forms.Form):
    name = forms.CharField(required=False)
    type = forms.ChoiceField(choices=COMP_TYPE_CHOICES_AND_EMPTY, required=False)

Модель остается такой же, как была.

36
ответ дан 27 November 2019 в 00:26
поделиться

Попробуйте добавить blank = True к полям модели (при условии, что это желаемое поведение), затем измените форму на ModelForm и удалите определения полей. Обратите внимание, что любые поля, для которых вы установили blank = True , не потребуются при проверке или сохранении модели. Опять же, это может быть не то, что вам нужно, но если это так, это позволит Django позаботиться о некоторых вещах автоматически.

В противном случае просто измените свой COMPETITION_TYPE_CHOICES на:

COMPETITION_TYPE_CHOICES = (
    ('', '---------'),
    ('1', 'Olympic Games'),
    ('2', 'ISU Championships'),
    ('3', 'Grand Prix Series'),
)
5
ответ дан 27 November 2019 в 00:26
поделиться

Лучше обновить выбор полей в форме init method

COMPETITION_TYPE_CHOICES = (
    (1, 'Olympic Games'),
    (2, 'ISU Championships'),
    (3, 'Grand Prix Series'),
)


class CompetitionSearchForm(forms.Form):
    name = forms.CharField(required=False)
    type = forms.ChoiceField(choices=COMPETITION_TYPE_CHOICES,required=False)

    def __init__(self, *args, **kwargs):
        super(CompetitionSearchForm, self).__init__(*args, **kwargs)
        self.fields['type'].choices.insert(0, ('','---------' ) )
9
ответ дан 27 November 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: