2017-08-22 76 views
0

我正在寻找一种方法来显示有点不同的BooleanFields。 我的代码如下:用下拉选择显示Django的BooleanFields

在models.py

class Order(models.Model): 
"""Variables to set the type of sauce desired""" 
    spicy = models.BooleanField(default=False) 
    regular = models.BooleanField(default=False) 
    delicate = models.BooleanField(default=False) 
    extra_delicate = models.BooleanField(default=False) 

我怎样才能实现形式,其中BooleanFields显示为一个下拉列表? 所以,而不是有四个复选框(一个辣,一个常规..等),我想有一个单一的下拉选择辣,普通等,使用户可以从那里选择他们的选择酱,而不是必须检查相关的复选框。

我曾尝试: 我试图创造的酱汁一个独立的模型,然后将其连接到订货型号通过一个ForeignKey场。但是,这看起来不太正确。

非常感谢您的任何建议。

回答

1

如果您只希望用户选择单一选项,则最好使用单个字段而不是四个布尔值。如果你很高兴为被硬编码的选择,那么你可以使用与选择,而不是一个外键到一个单独的模型CharField

class Order(models.Model): 
    SAUCES = [ 
     ('spicy', 'Spicy'), 
     ('regular', 'Regular'), 
     ('delicate', 'Delicate'), 
     ('extra_delicate', 'Extra Delicate'), 
    ] 
    sauce = models.CharField(max_length=30, choices=SAUCES) 
+0

谢谢@Alasdair,肯定会使用CharField的选择。使用布尔值的主要原因是另一段代码在其中一个值设置为True时触发某个操作,但我想我也可以在用户从下拉列表中选择某个值时触发该操作。 – Giulia

2

一个可能的解决方案将是使用Field.choices

class Order(models.Model): 
    SPICY = 'S' 
    REGULAR = 'R' 
    DELICATE = 'D' 
    EXTRA_DELICATE = 'D+' 

    SAUCE_CHOICES = (
     (SPICY, 'Spicy'), 
     (REGULAR, 'Regular'), 
     (DELICATE, 'Delicate'), 
     (EXTRA_DELICATE, 'Extra Delicate') 
    ) 

    sauce = models.CharField(max_length=32, choices=SAUCE_CHOICES, default=SPICY) 

模型变得有点大,但是,作为文档说:

虽然你可以在模型类之外定义选项列表,然后引用它,定义每个通道的选择和名称模型类中的oice将所有这些信息与使用它的类保持一致,并使得选择易于引用(例如,Order.SPICY将在导入Order模型的任何地方工作)。