Как отобразить имена опций вместо значений опций? - PullRequest
0 голосов
/ 13 августа 2011

Я возился с get_FOO_display безрезультатно, вот что у меня получилось (я кое-что обрезал, чтобы его было легче читать, например, пользовательское сохранение по умолчанию:

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

Вывод, который я хочу:

Уровень Primary
Piplevel Diamond
Посол тщеславия

Я попытался заменить цикл {{field}} и for на {{field.get.level.display}} и {{field.get_piplevel_display}}, но они просто вернули пробелы. Когда они отображаются, они представляют собой раскрывающееся меню и имеют все доступные именованные опции, то есть, когда я нажимаю «15», я получаю список опций, т. Е .:

.

Piplevel 15 click (текущее выбрано 15) (значение опции = "1"> Обычное (/ option> (значение опции = "2"> Platinum (/ option> и т. Д. (Не HTML-код) )

Мне не хватает какой-то простой функции в Django для этого?

Редактировать: Вот вывод 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>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}} на {{field.get_piplevel_display}} или {{field.choice.get_piplevel_display}}, я получу это в качестве вывода:

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

Кажется, что это то, что все хотят, и поэтому я ожидал, что в Django будет какой-то аргумент, который просто ... исправит это, но я не могу его найти. Извините за то, что простой вопрос казался таким сложным - это должен быть простой вопрос, не так ли?

Ответы [ 2 ]

4 голосов
/ 15 августа 2011

Для каждого поля, в котором есть выбор, Django автоматически добавляет метод get_FOO_display() в модель ( docs ). Все, что делает этот метод, это берет уже сохраненное значение для поля, ищет его в предоставленных вариантах выбора для поля и возвращает текст "display" для этого значения.

Этот метод не доступен в поле или в форме. Вы должны ссылаться на существующий объект или экземпляр формы (например, form.instance).

Опять же, я не уверен, что вы пытаетесь выполнить, потому что <select> уже заполнены так, что они отображают текст, а не базовое значение. Даже если вы редактируете существующий объект, <select> все равно будет отображать отображаемый текст для текущего установленного значения.

1 голос
/ 14 августа 2011

Я действительно не вижу, что вы пытаетесь сделать, но:

{{field.get.level.display}}

должно быть что-то вроде

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