1. ホーム
  2. python

[解決済み] Django で "choices" フィールドのオプションを正しく使う方法

2023-01-11 12:12:45

質問

チュートリアルを読んでいるところです。 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 というモデルにあるので、私が提供したコードでは、データベースに "MonthsChoice)という列を作成し、ユーザーが月をクリックしてフォームを送信した後に、何月生まれかを示すのでしょうか?

どのように解決するのですか?

によると のドキュメントによると :

フィールド.選択肢

それ自身からなる反復可能なもの(例えばリストやタプル)。 ちょうど2つの項目(例えば[(A, B), (A, B) ...])で構成される反復可能なもので、このフィールドの選択肢として使用されます。 で構成されるリストまたはタプルである。これが与えられた場合、デフォルトのフォームウィジェットは、これらの選択肢を持つセレクトボックスとなります。 は標準的なテキストフィールドの代わりにこれらの選択肢を持つセレクトボックスとなります。

各タプルの最初の要素は、格納される実際の値です。 2番目の要素は人間が読み取れる名前です。

というわけで、あなたのコードは正しいのですが、変数を定義する必要があります。 JANUARY , FEBRUARY などを使用するか calendar モジュールを使って 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')