如何显示选项名称而不是选项值?

时间:2011-08-13 19:14:38

标签: django django-templates django-forms

我用get_FOO_display无济于事,这就是我所拥有的(我修剪了一些东西,使其更容易阅读,就像自定义def保存:

class Profile(models.Model):
LEVEL_CHOICES = (
(1, 'Primary'),
(2, 'Secondary'),
(3, 'Tertiary'),
)

level = models.IntegerField( verbose_name = 'Level', blank=True, null=True, choices=LEVEL_CHOICES)
piplevel = models.ForeignKey(AccessLevel, related_name='profiles')
vanity = models.ForeignKey(AccessLevel, related_name='vanity')



class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile


 # HTML CODE from Template below
    <tbody>
        {% for field in user_form %}
        <tr>
                            <th>{{ field.label_tag }}</th>
                            <td class="updatable">
                                <div class="field">
                                    {{ field }}
                                </div>
                                {% if field.errors %}{{ field.errors }}{% endif %}
                            </td>
        </tr>
        {% endfor %}

        {% for field in profile_form %}
        <tr>
                            <th>{{ field.label_tag }}</th>
                            <td class="updatable">
                                <div class="field">
                                    {{ field }}
                                </div>
                                {% if field.errors %}{{ field.errors }}{% endif %}
                            </td>
                        </tr>
        {% endfor %}
    </tbody>

我得到的输出:

等级1 Piplevel 15
虚荣20

我想要的输出:

等级小学 Piplevel Diamond
虚荣大使

我尝试用{{field.get.level.display}}和{{field.get_piplevel_display}}替换{{field}}和for循环,但它们只返回了空白。当这些显示时,它们是一个下拉菜单,DO有所有可用的命名选项 - 也就是说,当我点击“15”时,我会得到一个选项列表,即:

Piplevel 15 点击(当前选择的是15)(选项值=“1”&gt;常规(/选项&gt;(选项值=“2”&gt;白金(/选项&gt;等)(不是HTML代码)

我是否在Django中遗漏了一些简单的功能?

编辑:这是我目前的GET输出。

 <tr class="even">
<th>
<label for="id_piplevel">Piplevel</label>
</th>
<td class="updatable" title="Click to modify">
<div class="field" style="display: none;">
<select id="id_piplevel" name="piplevel">
<option value="">---------</option>
<option value="1">Regular</option>
<option value="2">Platinum</option>
...
<option selected="selected" value="7">Emerald</option>
</select>
</div>
<div>7</div>
</td>
</tr>

这是我想要的HTML输出,理想情况是:

 <tr class="even">
<th>
<label for="id_piplevel">Piplevel</label>
</th>
<td class="updatable" title="Click to modify">
<div class="field" style="display: none;">
<select id="id_piplevel" name="piplevel">
<option value="">---------</option>
<option value="1">Regular</option>
<option value="2">Platinum</option>
...
<option selected="selected" value="7">Emerald</option>
</select>
</div>
<div>Emerald</div>
</td>
</tr>

而且,如果我用{{field.get_piplevel_display}}或{{field.choice.get_piplevel_display}}替换{{field}},我会将其作为输出:

<tr class="even">
<th>
<label for="id_piplevel">Piplevel</label>
</th>
<td class="updatable">
<div class="field"> </div>
</td>
</tr>

似乎这是每个人都想要的东西,所以我希望在Django中有一些争论只是......解决了这个问题,但我找不到它。抱歉让一个简单的问题看起来如此复杂 - 这应该是一个简单的问题,不是吗?

2 个答案:

答案 0 :(得分:3)

对于每个有选择的字段,Django会自动在模型上添加get_FOO_display()方法(docs)。所有这个方法都是为字段取已存储的值,在提供的字段选项中查找它,并返回该值的“显示”文本。

此字段或表单上的可用。您必须引用现有对象或表单实例(例如form.instance)。

同样,我不确定你要完成什么,因为<select>已经填充,以便它们显示文本而不是基础值。即使您正在编辑现有对象,<select>仍将显示当前设置值的显示文本。

答案 1 :(得分:1)

我真的没有看到你想要做什么,但是:

{{field.get.level.display}}

应该是

{{field.choices.get_level_display}}
# or
{{field.get_level_display}}