2017-09-03 56 views
0

我想要生成一個列表來填充表單的選擇。這個列表將是動態的,並且取決於其他用戶創建了哪些選擇。這裏是清單應獲得從模型的例子:如何創建一個動態的Django選擇字段

#models.py 
class User(models.Model): 
    brewery_you_work_for = models.CharField(choises=ALL_THE_BREWERIES_IN_THE_WORLD) 
    username = models.CharField() 

我想要的形式是這樣的:

#forms.py 
class BestBrewery(forms.Form): 
    vote = forms.ChoiceField(choices=BREWERIES_A_USER_WORKS_FOR) 

我想要做的是有所有釀酒廠的名單在世界上,一些用戶可以選擇作爲他們工作的啤酒廠。然後我想爲其他用戶生成一份列表,作爲最佳啤酒廠投票。假設我有3名用戶聲稱他們在Sierra Nevada工作,2名用戶聲稱他們爲Budweiser工作,5名用戶聲稱他們爲Coors工作。

我要生成啤酒廠,將看起來像這樣的列表:

(
'Budweiser', 
'Coors, 
'Sierra Nevada', 
) 

注意字母順序排列,並沒有重複啤酒廠上市。

回答

1

嗯,我想你可以設置「選擇」作爲功能的結果。 我想這樣的:

def yolo(): 
    # there we will get stats from db and return choices depends on stats 
    first_query = 1 # there U will use more complicated logic :) 
    second_query = 3 
    if first_query > second_query: 
     return (1, 2, 3) 
    else: 
     return (1, 3) 

class Event(models.Model): 
    date = models.DateField(primary_key=True) 
    count_of_updates = models.SmallIntegerField(default=0) 
    yolos = models.CharField(max_length=255, choices=yolo()) 

而且,對於被確定U可以檢查烏爾選擇與醜陋的東西:

choices = s._meta.get_field_by_name('yolos')[0].choices 
print choices 

訂單和其他東西u能在FUNC邏輯:)

0

設置在你的表單中,你可以改變你的字段在init中的選擇。

class BestBrewery(forms.Form): 
    vote = forms.ChoiceField() 

    def __init__(self, *args, **kwargs): 
     super(BestBrewery, self).__init__(*arg, **kwargs) 

     # get the choices from where you need 
     choices = (...) 
     self.fields['vote'].choices = choices 
0

當初始化表單時,您需要傳遞額外的user參數。通常,這樣如果你使用的視圖功能:

form = BestBrewery(request.user) 

如果你正在使用基於類的意見,你應該重寫get_form_kwargs方法在您的視圖:

def get_form_kwargs(self): 
    kwargs = super(MyView, self).get_form_kwargs() 
    kwargs['user'] = self.request.user 

    return kwargs 

你的形式應該是這樣的:

class BestBrewery(forms.Form): 

    def __init__(self, user, *args, **kwargs): 
     super(BestBrewery, self).__init__(*args, **kwargs) 

     self.fields['vote'].choices = (
      user.brewery_you_work_for, 
      user.get_brewery_you_work_for_display() 
     ) 

請注意,要覆蓋choices字段,您需要提供包含表單值和要顯示在文本中的文本的元組擁有。

相關問題