DjangoのFormPreviewを使って表示した確認ページでchoicesの表示

djangoのmodelでchoicesを持つフィールドはget_FOO_displayでhuman readableな値を返してくれます。

Model instance reference | Django documentation | Django


こんな感じで使えます。

from django.db import models
from django_localflavor_jp.jp_prefectures import JP_PREFECTURES

class Address(models.Model):
    name = models.CharField(max_length=100)
    prefecture = models.CharField(max_length=100, choices=JP_PREFECTURES)
    address = models.CharField(max_length=100)
>>> a =  Address.objects.create(name="yuhei", prefecture='hokkaido', address='test')
>>> print a.get_prefecture_display()
北海道

このAddressモデルのModelFormを作成して、FormPreviewで確認画面をだしてみる




ちょっと確認画面の表示が残念です。hokkaidoになってます。


確認の表示部分はこのようなテンプレートになってます。

<table>
{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data }}</td>
</tr>
{% endfor %}
</table>


以下のようにすれば北海道と出せますが、

{{ form.instance.get_prefecture_display }}


汎用的に使うためのtemplatetagの実装が紹介されていたので使ってみます。

templatetags/data_verbose.py

from django import template

register = template.Library()


@register.filter
def data_verbose(boundField):
    """
    Returns field's data or it's verbose version
    for a field with choices defined.

    Usage::

        {% load data_verbose %}
        {{form.some_field|data_verbose}}
    """
    data = boundField.data
    field = boundField.field
    return hasattr(field, 'choices') and dict(field.choices).get(data, '') or data
{% load data_verbose %}
<table>
{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field|data_verbose }}</td>
</tr>
{% endfor %}
</table>


こうするとchoicesを持つフィールドの場合は値の方を表示できます。


関連 : DjangoのFormPreviewを使って確認ページを表示する - brainstorm

参考 : python - How to get the label of a choice in a Django ChoiceField? - Stack Overflow
参考 : Django templates: verbose version of a choice - Stack Overflow