Django:選択肢の値を表示する


245

models.py:

class Person(models.Model):
    name = models.CharField(max_length=200)
    CATEGORY_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    gender = models.CharField(max_length=200, choices=CATEGORY_CHOICES)
    to_be_listed = models.BooleanField(default=True)
    description = models.CharField(max_length=20000, blank=True)

views.py:

def index(request):
    latest_person_list2 = Person.objects.filter(to_be_listed=True)
    return object_list(request, template_name='polls/schol.html',
                       queryset=latest_person_list, paginate_by=5)

テンプレートでは、を呼び出すとperson.gender'M'またはの'F'代わりに'Male'またはを取得し'Female'ます。

コード(/ )の代わりに値('Male'または'Female')を表示する方法'M''F'



私はこの方法を試しました、私のテンプレートで使用しています:{%for person in object_list%} some html {{person.get_gender_display()}} html {%endfor%}次のエラーが発生します:例外値:解析できませんでした残り: '()' 'person.get_gender_display()'から
Shankze

7
悪い点ですが、person.get_gender_displayの後に '()'を含めるべきではありませんでした。その現在動作しています。ありがとう。
シャンクゼ

3
ほんの少しのコメント、性別はMまたはF(1文字の長さ)のいずれかになるため、charfieldの最大長をに設定しても意味がありません200。でmax_lenght=1十分です、あなたのサイトをより効率的になり、あなたが間違ったデータを持って文句を言わないことを保証します。:)
アレハンドロガルシア

回答:


502

それはあなたが正しい軌道に乗っていたように見えます- get_FOO_display()間違いなくあなたが望むものです:

では、テンプレート、あなたは含まれていない()メソッドの名前に。以下をせよ:

{{ person.get_gender_display }}

この方法は貴重です。しかし、メソッドを使用する以外に、たとえば{{i.item.what_to_put_here}}に格納されている値を取得する方法は何ですか?
KhoPhi

11
ただし、テンプレートにJinja2を使用する場合は、括弧を含める必要があります。{{ person.get_gender_display() }}
adam b

1
ボーナスポイント:JSONを介して情報を送信する場合(ページネーションシナリオなど)、これを行うための最良の方法は何ですか?理想的には、モデルを1つずつインスタンス化してget_field_display()を呼び出すというオーバーヘッドがありません。
DylanYoung 2017年

7
お奨めは、ほぼ10年後のDjangoを愛していて、答えはまだ有効です!Thx +1して飲んで。
Marc

1
どういうわけか、これは翻訳されたテキストを取得しません。i18がすでにWebサイトに実装されている場合、翻訳されたテキストを取得する方法についてのアイデアはありますか?
Anoop Nair

16

選択肢が設定されているすべてのフィールドについて、オブジェクトにはget_FOO_display()メソッドがあります。FOOはフィールドの名前です。このメソッドは、フィールドの「人間が読める」値を返します。

ビュー内

person = Person.objects.filter(to_be_listed=True)
context['gender'] = person.get_gender_display()

テンプレート内

{{ person.get_gender_display }}

get_FOO_display()のドキュメント


1

他の人はget_FOO_displayメソッドが必要なものだと指摘しました。私はこれを使っています:

def get_type(self):
    return [i[1] for i in Item._meta.get_field('type').choices if i[0] == self.type][0]

これは、特定のアイテムが持っているすべての選択肢を、アイテムタイプに一致するものを見つけるまで繰り返します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.