30

我有一个模型需要存储出生年份。我正在使用 django 管理员。使用它的人每天都会填写大量的人,并且 DateField() 显示太多(对日/月不感兴趣)。

这是一个模型模型,展示了它现在的样子:

class Person(models.Model):
  name = models.CharField(max_length=256)
  born = models.IntegerField(default=lambda: date.today().year - 17)

如您所见,大多数人都是 17 岁,所以我将他们的出生年份作为默认值。

我可以做得更好吗?如何从 DateField 中创建 YearField?如果制作一个 YearField,我什至可以制作一些“简单的标签”,比如那个日期的“现在”。(当然,一个专门的 BornYearField 会有 1989、1990、1991 和其他常见年份的简单按钮)

4

4 回答 4

31

我发现这个解决方案可以非常优雅地解决整个问题(不是我的代码):

import datetime
YEAR_CHOICES = []
for r in range(1980, (datetime.datetime.now().year+1)):
    YEAR_CHOICES.append((r,r))

year = models.IntegerField(_('year'), choices=YEAR_CHOICES, default=datetime.datetime.now().year)

编辑范围开始以扩展列表:-)

于 2014-07-09T14:13:02.473 回答
8

此外,这与您的情况无关,但注意不要使用 datetime.date.today() 或 datetime.datetime.now() 作为默认值。这在服务器启动时执行一次。

您最好将可调用对象传递给:

date = models.DateField(default=datetime.date.today)

请注意,您可以使用 lambda 使其相对:

date = models.DateField(default=lambda : datetime.date.today() - datetime.timedelta(days=6210))

当然,这是幼稚的,假设过去 17 年有 5 个闰年。

于 2009-10-06T01:25:22.653 回答
6

你也可以这样做:

YEARS = (
    ("1990", "1990"),
    ("1991", "1991"),
    ("1992", "1992"),
    # P.e. generate a list from 1960 to date.today().year
    # The reason why they choice key and text value are the
    # same is that if you generate from 1960 to 2060 it will collide.
    #
    # E.g
    # from datetime import datetime
    # def tuplify(x): return (x,x)   # str(x) if needed
    # current_year = datetime.now().year
    # YEARS = map(tuplify, range(1930, current_year + 1))  # range(1,4) gives [1,2,3]
)

class Whatever(models.Model):
    # Show a list with years
    birthdate = models.IntegerField(max_length=2, choices=YEARS)

我希望这能帮到您。

于 2010-09-18T13:14:19.227 回答
6

对于不涉及模型选择的解决方案:

from django.core.validators import MinValueValidator, MaxValueValidator

class Person(models.Model):
    year = models.PositiveIntegerField(
            validators=[
                MinValueValidator(1900), 
                MaxValueValidator(datetime.now().year)],
            help_text="Use the following format: <YYYY>")

这还将在输入字段中创建一个占位符,其值为help_text

于 2017-08-12T17:16:55.503 回答