У меня есть модель:
from django.db import models
CHOICES = (
('s', 'Glorious spam'),
('e', 'Fabulous eggs'),
)
class MealOrder(models.Model):
meal = models.CharField(max_length=8, choices=CHOICES)
У меня есть форма:
from django.forms import ModelForm
class MealOrderForm(ModelForm):
class Meta:
model = MealOrder
И я хочу использовать formtools.preview. В шаблоне по умолчанию печатается краткая версия выбранного варианта («e» вместо «Fabulous egg»), поскольку в нем используется
{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data }}</td>
</tr>
{% endfor %}.
Я хотел бы иметь такой же общий шаблон, как упомянутый, но вместо этого печатал бы «Сказочные яйца».
[поскольку у меня были сомнения, где настоящий вопрос, я выделил его для всех нас :)]
Я знаю, как получить подробную версию выбора некрасивым способом:
{{ form.meal.field.choices.1.1 }}
Настоящая боль в том, что мне нужно получить выбранный вариант, и единственный способ, который приходит мне в голову, - это перебирать варианты и проверки {% ifequals currentChoice.0 choiceField.data %}
, что еще хуже.
Легко ли это сделать? Или для этого нужно программирование шаблонных тегов? Разве это не должно быть уже доступно в django?
источник
Лучшее решение вашей проблемы - использовать вспомогательные функции. Если варианты сохранены в переменной CHOICES, а поле модели, в котором хранится выбранный вариант, - это ' choices ', вы можете напрямую использовать
в вашем шаблоне. Здесь x - экземпляр модели. Надеюсь, поможет.
источник
Приношу свои извинения, если этот ответ повторяется с любым из перечисленных выше, но похоже, что этот еще не предлагался, и он кажется довольно чистым. Вот как я это решил:
Мое представление передает Scoop в шаблон (примечание: не Scoop.values ()), а шаблон содержит:
источник
Основываясь на ответе Ноя, вот версия, неуязвимая для полей без выбора:
Я не уверен, можно ли использовать фильтр для этой цели. Если у кого-нибудь есть решение получше, буду рад его видеть :) Спасибо, Ной!
источник
Мы можем расширить фильтрующее решение Ноа, чтобы оно было более универсальным в работе с данными и типами полей:
Вот код:
источник
Я не думаю, что есть какой-то встроенный способ сделать это. Однако фильтр может помочь:
Тогда вы сможете:
источник
Добавьте в свой models.py одну простую функцию:
Теперь вы можете получить подробное значение таких полей выбора:
Upd .: Не уверен, достаточно ли этого решения «pythonic» и «django-way», но оно работает. :)
источник
У вас есть Model.get_FOO_display (), где FOO - это имя поля, в котором есть варианты.
В вашем шаблоне сделайте следующее:
источник