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() をデフォルトとして使用しないでください。これは、サーバーの起動時に 1 回実行されます。

callable を次のように渡す方がはるかに優れています。

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

ラムダを使用して相対にすることができることに注意してください。

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 に答える