Привязка данных к полю выбора формы django

У меня простая форма,

class Compose(forms.Form):
    CHOICES = ()    
    recepient = forms.ChoiceField(choices=CHOICES)
    subject = forms.CharField(max_length=100)
    message = forms.CharField(widget=forms.Textarea)

Выбор генерируется как

def mychoiceview(request):
        subscribed_lists, other_lists = getListOfLists(request.user.email)
        for lst in subscribed_lists:
            # list name and list address
            CHOICES = CHOICES + ((lst[1],lst[0]),)

        #Bind data to form and render

По сути, пользователь подписан на определенные списки (из расширенного набора списков) и может выбрать (через раскрывающийся список), в какой список он / она хочет отправить сообщение.

Проблема в том, что я не могу найти, как связать «ВЫБОР» с формой django.

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

Любые идеи ?

Спасибо !


person user1349663    schedule 20.07.2013    source источник
comment
возможный дубликат выборов динамической формы django   -  person Hedde van der Heide    schedule 20.07.2013
comment
этот ответ является близким приближением: 8933723/ , я также добавил более прямой ответ.   -  person lsh    schedule 02.08.2013


Ответы (2)


Решение @nnmware правильное, но слишком сложное/запутанное. Ниже приведена более краткая версия, которая работает так же хорошо:

class DynamicBindingForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(DynamicBindingForm, self).__init__(*args, **kwargs)
        self.fields['recipient'] = forms.ChoiceField(choices=db_lookup_choices())

где db_lookup_choices — обращение к какой-либо базе данных или другому набору динамических данных и возвращает список пар для выбора: [('val', 'Label'),('val2', 'Label2')]

person lsh    schedule 02.08.2013
comment
И где у вас доступ к запросу в этом решении? - person nnmware; 03.08.2013
comment
у вас есть контроль над конструктором, поэтому просто передайте его в качестве параметра. не забудьте передать его родительскому классу. - person lsh; 08.08.2013
comment
Пользователь спрашивает - как отправить параметр? В его варианте - параметр-запрос. Вы отвечаете неконкретно. - person nnmware; 09.08.2013
comment
Это только для старого общего представления (устарело в будущих версиях). Для просмотра на основе классов необходимо использовать метод get_form_kwargs. Но да- теперь нормальная работа, но CBV лучше. - person nnmware; 11.08.2013
comment
Вы придираетесь к мелочам, и CBV не обязательно лучше, поэтому удалите свой отрицательный голос. Из документов: Представления на основе классов предоставляют альтернативный способ реализации представлений как объектов Python вместо функций. Они не заменяют представления, основанные на функциях. - person lsh; 18.08.2013

Если вы используете представление на основе классов, то:

в представлении сделать миксин для отправки запроса в форме

class RequestToFormMixin(object):
    def get_form_kwargs(self):
        kwargs = super(RequestToFormMixin, self).get_form_kwargs()
        kwargs.update({'request': self.request})
        return kwargs

class YouView(RequestToFormMixin, CreateView):
    model = YouModel
    # etc

в форме сделать миксин для получения запроса из представления

class RequestMixinForm(forms.Form):
    def __init__(self, *args, **kwargs):
        request = kwargs.pop('request')
        super(RequestMixinForm, self).__init__(*args, **kwargs)
        self._request = request

class Compose(RequestMixinForm):
    subject = forms.CharField(max_length=100)
    message = forms.CharField(widget=forms.Textarea)

    def __init__(self, *args, **kwargs):
        super(Compose, self).__init__(*args, **kwargs)
        subscribed_lists, other_lists = getListOfLists(self._request.user.email)
        for lst in subscribed_lists:
            # list name and list address
            CHOICES = CHOICES + ((lst[1],lst[0]),)    
        self.fields['recipient'] = forms.ChoiceField(choices=CHOICES)
person nnmware    schedule 20.07.2013