web-dev-qa-db-ja.com

Django admin、DateFieldの代わりにYearFieldで年を表示するだけですか?

誕生年を保存する必要があるモデルがあります。私はDjango adminを使用しています。これを使用している人は毎日たくさんの人に記入し、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年、およびその他の一般的な年の簡単なボタンがあります)

28

私は見つけました この解決策 これは私が思う(私のコードではなく)全体を非常にエレガントに解決します:

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)

範囲開始を編集してリストを拡張します:-)

27
Nils Herde

また、これはあなたのケースにはそれほど関係ありませんが、デフォルトとしてdatetime.date.today()またはdatetime.datetime.now()を使用しないでください。これは、サーバーの起動時に1回実行されます。

呼び出し可能オブジェクトを次の場所に渡す方がはるかに優れています。

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

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

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

もちろん、これはナイーブであり、過去17年間で5つのうるう年があったことを前提としています。

9

これを行うこともできます:

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)

これがお役に立てば幸いです。

6
Oscar Carballal

モデルの選択を伴わないソリューションの場合:

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の値を持つプレースホルダーが作成されます。

4
py4on