2009-04-27 6 views
2

Как получить значения полей выбора, а не ключ из формы?Доступ к значениям выбора MultipleChoiceField

У меня есть форма, где я позволяю пользователю выбирать электронные письма для компании. Например, у меня есть форма, как это (эта причина для модели формы является то, что она находится внутри formset - но это сейчас не важно):

class Contacts(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(Contacts, self).__init__(*args, **kwargs) 
     self.company = kwargs['initial']['company'] 
     self.fields['emails'].choices = self.company.emails 
     # This produces stuff like: 
     # [(1, '[email protected]'), ...] 

    emails = forms.MultipleChoiceField(required=False) 

    class Meta: 
     model = Company 

, и я хочу, чтобы получить список всех выбранных сообщений электронной почты в вид, что-то вроде этого:

form = ContactsForm(request.POST) 
    if form.is_valid(): 
     form.cleaned_data['emails'][0] # produces 1 and not email 

Там нет get_emails_display() вида метода, как и в модели, например. Кроме того, предложение form.fields['emails'].choices не работает, поскольку оно дает ВСЕ варианты, тогда как мне нужно что-то вроде form.fields['emails'].selected_choices?

Любые идеи, или дайте мне знать, если это неясно.

ответ

0

Это может быть не очень красивое решение, но я бы предположил, что отображаемые имена все еще доступны с form.fields['emails'].choices, поэтому вы можете пропустить form.cleaned_data['emails'] и получить имя выбора из выбора поля.

+0

Прохладный, это на самом деле form.fields ['email']. Пожалуйста, исправьте, поэтому я могу принять :-) – drozzy

+0

Примечание выше все еще возвращает список кортежей: [(1, '[email protected]'), (2, '[email protected]')] – drozzy

+0

whoops, my Плохо. Исправлена. :) –

7

Хорошо, надеюсь, это ближе к тому, что вы хотели.

emails = filter(lambda t: t[0] in form.cleaned_data['emails'], form.fields['emails'].choices) 

Это должно предоставить вам список выбранных вами вариантов.

+0

Я не понимаю, как это будет работать. form.fields ['emails']. options вернет список всех писем, а form.cleaned_data ['emails'] возвращает список ключей только выбранных элементов. – drozzy

+0

Итак, допустим, у вас есть выбор = [(1, 'foo'), (2, 'bar'), (3, 'baz')], и пользователь выбирает [1, 3]. Фильтр делает: emails = filter (lambda t: t [0] in [1, 3], [(1, 'foo'), (2, 'bar'), (3, 'baz')]) Который возвращает [(1, 'foo'), (3, 'baz')] – tghw

+0

OOh, right dooh me. Благодаря! – drozzy

Смежные вопросы