一些Django ChoiceFields具有相同的选择源

时间:2015-12-16 23:37:36

标签: python django choicefield

我有一个这样的模型:

class MyModel(models.Model):
    DAYS = ((str(d), str(d)) for d in range(1, 29))

    day1 = models.CharField('Day 1', max_length=3, null=True, blank=True, choices=DAYS)
    day2 = models.CharField('Day 2', max_length=3, null=True, blank=True, choices=DAYS)

渲染完成后,我发现只有字段day1有选择列表,但day2为空。如果我使用相同的定义创建另一个常量DAYS2并将其分配给day2 - 它就可以。

似乎Django修改了choices参数的来源?我没有在消息来源中找到它,但也许我做错了什么?这是一个已知的限制吗?

我可以使用在deepcopy上应用DAYS的解决方法。但我不认为这是好风格。还有另一种方式吗?

1 个答案:

答案 0 :(得分:3)

使用DAYS的列表:

class MyModel(models.Model):
    DAYS = [str(d), str(d)) for d in range(1, 29)]
    day1 = models.CharField('Day 1', max_length=3, null=True, blank=True, choices=DAYS)
    day2 = models.CharField('Day 2', max_length=3, null=True, blank=True, choices=DAYS)

目前,DAYS是一个生成器。当您第一次访问day1时,它会返回您期望的结果。但是,生成器已被使用,因此当您尝试获取day2的选项时,您将获得一个空列表。

您可以通过在Python shell中尝试以下内容来看到这一点:

>>> DAYS = ((str(d), str(d)) for d in range(1,5))
>>> print(list(DAYS))
[('1', '1'), ('2', '2'), ('3', '3'), ('4', '4')]
>>> print(list(DAYS))
[]
>>>