2013-07-20 69 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表單。

一些在線解決方案包括使用模型..但我沒有查詢集...只是一個動態生成的ID元組我想要choicefield呈現。

任何想法?

謝謝!

+0

可能重複[ Django動態表單選擇](http://stackoverflow.com/search?q=django+dynamic+form+choices) –

+0

這個答案是一個近似的近似值:http://stackoverflow.com/questions/8933723/making-choices-形式動態,我也增加了一個更直接的答案。 – 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

如果使用基於類的視圖,則:在視圖化妝混入

在形式發送請求

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 

在形式使MIXIN從視圖接收請求

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)