Еще одна вещь отметить, если Вы обновили приложение прежней версии, которое имело структуры для использования классов, Вы могли бы столкнуться со следующей проблемой:
Старый код имеет структуры, код был очищен и они измененные на классы. Виртуальная функция или два была тогда добавлена к новому обновленному классу.
, Когда виртуальные функции будут в классах тогда внутренне, компилятор добавит дополнительный указатель на данные класса для указания на функции.
то, Как это повредило бы старый унаследованный код, - то, если бы в старом коде где-нибудь структура была очищена с помощью memfill для очистки всего этого к нулям, это затоптало бы дополнительные данные указателя также.
Я не думаю, что есть какой-то встроенный способ сделать это. Однако фильтр может помочь:
@register.filter(name='display')
def display_value(bf):
"""Returns the display value of a BoundField"""
return dict(bf.field.choices).get(bf.data, '')
Затем вы можете сделать:
{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data|display }}</td>
</tr>
{% endfor %}
В шаблонах Django вы можете использовать метод « get_FOO_display ()
», который вернет читаемый псевдоним для поля, где «FOO» - это имя поля. .
Примечание: если стандартные шаблоны FormPreview
не используют его, вы всегда можете предоставить свои собственные шаблоны для этой формы, которые будут содержать что-то вроде { {form.get_meal_display}}
.
На основании ответа Ноя, вот версия, невосприимчивая к полям без выбора:
#annoyances/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
Я не уверен, можно ли использовать фильтр для этой цели. Если у кого-нибудь есть решение получше, я буду рад его увидеть :) Спасибо, Ной!