使用下拉选择显示Django BooleanFields

时间:2017-08-22 09:55:41

标签: django django-models django-forms

我正在寻找一种以不同方式显示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显示为下拉列表的表单? 因此,我没有四个复选框(一个用于辣,一个用于常规......等),我希望有一个选择Spicy,Regular等的单个下拉菜单,以便用户可以从那里选择他们选择的酱汁,而不是检查相关的复选框。

我尝试了什么: 我尝试为酱料创建一个单独的模型,然后通过ForeignKey字段将其链接到Order模型。但是,这似乎不太对。

提前感谢您的任何建议。

2 个答案:

答案 0 :(得分: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)

模型变得更大,但正如文档所说:

  

虽然您可以在模型类之外定义选项列表然后引用它,但是为模型类中的每个选项定义选项和名称会将所有信息保存到使用它的类中,并使选择变得容易引用(例如,Order.SPICY将在导入Order模型的任何地方工作。

答案 1 :(得分: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)