2017-09-03 57 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字段,您需要提供包含表单值和要显示在文本中的文本的元组拥有。

相关问题