2013-07-20 3 views
2

У меня есть простая форма,привязка данных к DJANGO формирует choicefield

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

Chocies генерируется как

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.

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

Любые идеи?

Спасибо!

+0

возможного дубликат [ django dynamic form options] (http://stackoverflow.com/search?q=django+dynamic+form+choices) –

+0

этот ответ приблизительный: http://stackoverflow.com/questions/8933723/making-choices- in-forms-dynamic, я также добавил более прямой ответ. – lsh

ответ

1

Решение @ 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')]

+0

И где вы получаете доступ к «запросу» в этом решении? – nnmware

+0

у вас есть контроль над конструктором, поэтому просто передайте его в качестве параметра. не забудьте передать его родительскому классу. – lsh

+0

Пользователь спрашивает - как отправить параметр? В его варианте - параметр-запрос. Вы отвечаете на бетон. – nnmware

0

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

в виде макияжа Mixin для отправки запроса в виде

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) 

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

  • Нет связанных вопросов^_^