Добавить дополнительные опции в виджет выбора формы Django - PullRequest
19 голосов
/ 13 сентября 2010

У меня есть форма, которую я использую для создания фильтра наборов запросов.Форма извлекает параметры состояния проекта из базы данных.Однако я хотел добавить дополнительные параметры, например «Все акции в прямом эфире» ... поэтому поле выбора будет выглядеть примерно так:

  • Все акции *
  • Все живые акции*
  • Черновик
  • Отправлено
  • Принято
  • Сообщено
  • Проверено
  • Все выполненные акции *
  • Закрыто
  • Отменено

Здесь «*» - это те, которые я хотел бы добавить, а остальные взяты из базы данных.

Возможно ли это?

class PromotionListFilterForm(forms.Form):
    promotion_type = forms.ModelChoiceField(label="Promotion Type", queryset=models.PromotionType.objects.all(), widget=forms.Select(attrs={'class':'selector'}))
    status = forms.ModelChoiceField(label="Status", queryset=models.WorkflowStatus.objects.all(), widget=forms.Select(attrs={'class':'selector'})) 
    ...
    retailer = forms.CharField(label="Retailer",widget=forms.TextInput(attrs={'class':'textbox'}))

1 Ответ

30 голосов
/ 13 сентября 2010

Вы не сможете использовать ModelChoiceField для этого.Вам нужно будет вернуться к стандартному ChoiceField и вручную создать список параметров в методе __init__ формы.Что-то вроде:

class PromotionListFilterForm(forms.Form):
    promotion_type = forms.ChoiceField(label="Promotion Type", choices=(),
                                       widget=forms.Select(attrs={'class':'selector'}))
    ....

    EXTRA_CHOICES = [
       ('AP', 'All Promotions'),
       ('LP', 'Live Promotions'),
       ('CP', 'Completed Promotions'),
    ]

    def __init__(self, *args, **kwargs):
        super(PromotionListFilterForm, self).__init__(*args, **kwargs)
        choices = [(pt.id, unicode(pt)) for pt in PromotionType.objects.all()]
        choices.extend(EXTRA_CHOICES)
        self.fields['promotion_type'].choices = choices

Вам также понадобится сделать что-нибудь умное в методе clean() формы, чтобы перехватить эти дополнительные опции и правильно с ними справиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...