如何在 Django 中创建自定义选择字段?

How to create custom choice field in Django?

我正在尝试创建一个表单,用户可以在其中填写语言、描述和语言级别(中级、高级...)。

语言模型:

class Language(models.Model):
    shortcut = models.CharField(max_length=6)
    name = models.CharField(max_length=50)
    first_level_price = models.FloatField() # Basic
    second_level_price = models.FloatField() # Intermediate
    third_level_price = models.FloatField() # Advanced

    def __str__(self):
        return self.shortcut+': '+self.name

对于每种语言,存在三个级别和价格(first_level_pricesecond_level_pricethird_level_price)。

现在,我希望用户填写表格。其中一种形式应该是级别。用户只会选择 'Basic'、'Intermediate' 或 'Advanced'。按照这个选择,就会有价格计算。

所以如果user选择了'Basic',就会有first_level_price语言的价格。

我尝试了很多方法,但没有一个奏效。

level = forms.ChoiceInput(choices=('Basic','Intermediate','Advanced'))

选择应该是一对元组。该对中的第一个值是您进入表单实例的数据,该对的第二个值是您模板中显示的值:

level = forms.ChoiceField(choices=(('basic', 'Basic'), 
                                   ('intermediate', 'Intermediate'), 
                                   ('advanced', 'Advanced')))

检查 django doc 关于 choices 的详细信息。

您可以像这样更新您的模型:

class Language(models.Model):
    PRICE_CHOICES = (
            ('first_level_price', 'Basic'),
            ('second_level_price', 'Intermediate'),
            ('third_level_price', 'Advanced'),

        )

    first_level_price = models.FloatField() # Basic
    second_level_price = models.FloatField() # Intermediate
    third_level_price = models.FloatField() # Advanced

    shortcut = models.CharField(max_length=6)
    name = models.CharField(max_length=50)
    level = models.CharField(max_length=50, choices=PRICE_CHOICES)

    def __str__(self):
        return self.shortcut+': '+self.name

现在您可以使用此模型创建一个 ModelForm,它应该会按您期望的方式工作。

当用户选择 first_level_priceBasic 会员资格时,您现在可以从 first_level_price 字段获取价格。