如何正确使用 Django 中的“选择”字段选项

新手上路,请多包涵

我正在阅读这里的教程: https ://docs.djangoproject.com/en/1.5/ref/models/fields/#choices 我正在尝试创建一个框,用户可以在其中选择他出生的月份.我试过的是

 MONTH_CHOICES = (
    (JANUARY, "January"),
    (FEBRUARY, "February"),
    (MARCH, "March"),
    ....
    (DECEMBER, "December"),
)

month = CharField(max_length=9,
                  choices=MONTHS_CHOICES,
                  default=JANUARY)

这个对吗?我看到在我正在阅读的教程中,他们出于某种原因首先创建了变量,就像这样

FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'

他们为什么要创建这些变量?此外,MONTHS_CHOICES 在一个名为 People 的模型中,所以我提供的代码会在名为“People”的数据库中创建一个“Months Choices”列,它会说明用户在点击月份后出生的月份并提交表格?

原文由 SilentDev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 607
2 个回答

根据 文档

字段选择

一个可迭代对象(例如,列表或元组)由恰好两个项目(例如 [(A, B), (A, B) …])的可迭代对象组成,用作此字段的选项。如果给出,默认的表单小部件将是一个带有这些选项的选择框,而不是标准的文本字段。

每个元组中的第一个元素是要存储的实际值,第二个元素是人类可读的名称。

So, your code is correct, except that you should either define variables JANUARY , FEBRUARY etc. or use calendar module to define MONTH_CHOICES :

 import calendar
...

class MyModel(models.Model):
    ...

    MONTH_CHOICES = [(str(i), calendar.month_name[i]) for i in range(1,13)]

    month = models.CharField(max_length=9, choices=MONTH_CHOICES, default='1')

原文由 alecxe 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为实际上没有人回答过第一个问题:

他们为什么要创建这些变量?

这些变量不是绝对必要的。这是真的。你可以完美地做这样的事情:

 MONTH_CHOICES = (
    ("JANUARY", "January"),
    ("FEBRUARY", "February"),
    ("MARCH", "March"),
    # ....
    ("DECEMBER", "December"),
)

month = models.CharField(max_length=9,
                  choices=MONTH_CHOICES,
                  default="JANUARY")

为什么使用变量更好?错误预防和逻辑分离。

 JAN = "JANUARY"
FEB = "FEBRUARY"
MAR = "MAR"
# (...)

MONTH_CHOICES = (
    (JAN, "January"),
    (FEB, "February"),
    (MAR, "March"),
    # ....
    (DEC, "December"),
)

现在,假设您有一个视图,您可以在其中创建一个新的模型实例。而不是这样做:

 new_instance = MyModel(month='JANUARY')

你会这样做:

 new_instance = MyModel(month=MyModel.JAN)

在第一个选项中,您正在对值进行硬编码。如果您可以输入一组值,则应在编码时限制这些选项。此外,如果您最终需要更改 Model 层的代码,现在您无需在 Views 层进行任何更改。

原文由 JCJS 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题