Mam modelkę:
from django.db import models
CHOICES = (
('s', 'Glorious spam'),
('e', 'Fabulous eggs'),
)
class MealOrder(models.Model):
meal = models.CharField(max_length=8, choices=CHOICES)
Mam formularz:
from django.forms import ModelForm
class MealOrderForm(ModelForm):
class Meta:
model = MealOrder
I chcę użyć formtools.preview. Domyślny szablon drukuje wybraną skróconą wersję („e” zamiast „Bajeczne jajka”), ponieważ używa
{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data }}</td>
</tr>
{% endfor %}.
Chciałbym mieć szablon tak ogólny, jak wspomniany, ale zamiast tego wydrukować „Bajeczne jajka”.
[ponieważ miałem wątpliwości, gdzie jest prawdziwe pytanie, pogrubiłem je za nas wszystkich :)]
Wiem, jak uzyskać pełną wersję wyboru w sposób, który sam w sobie jest brzydki:
{{ form.meal.field.choices.1.1 }}
Prawdziwym bólem jest to, że muszę dokonać wyboru, a jedyny sposób, który przychodzi mi do głowy, to iterowanie przez wybory i sprawdzanie {% ifequals currentChoice.0 choiceField.data %}
, co jest jeszcze brzydsze.
Czy można to łatwo zrobić? A może potrzebuje trochę programowania szablonów? Czy nie powinno to już być dostępne w django?
źródło
Najlepszym rozwiązaniem problemu jest użycie funkcji pomocniczych. Jeśli wybory są przechowywane w zmiennej CHOICES, a polem modelu przechowującym wybrany wybór są „ opcje ”, możesz bezpośrednio użyć
w swoim szablonie. Tutaj x jest instancją modelu. Mam nadzieję, że to pomoże.
źródło
Przepraszam, jeśli ta odpowiedź jest zbędna z żadną wymienioną powyżej, ale wygląda na to, że ta nie została jeszcze zaoferowana i wydaje się dość czysta. Oto jak to rozwiązałem:
Mój widok przekazuje Scoop do szablonu (uwaga: nie Scoop.values ()), a szablon zawiera:
źródło
W oparciu o odpowiedź Noego, oto wersja odporna na pola bez wyboru:
Nie jestem pewien, czy można używać filtra do tego celu. Jeśli ktoś ma lepsze rozwiązanie, z przyjemnością je zobaczę :) Dziękuję Noah!
źródło
Możemy rozszerzyć rozwiązanie filtrujące Noah, aby było bardziej uniwersalne w radzeniu sobie z danymi i typami pól:
Oto kod:
źródło
Nie sądzę, aby można było to zrobić w żaden wbudowany sposób. Filtr może jednak załatwić sprawę:
Następnie możesz:
źródło
Dodaj do swojego models.py jedną prostą funkcję:
Teraz możesz uzyskać szczegółowe wartości pól wyboru, takich jak:
Uaktualnienie: Nie jestem pewien, czy to rozwiązanie „pythonic” i „django-way” wystarczy, czy nie, ale działa. :)
źródło
Masz Model.get_FOO_display (), gdzie FOO jest nazwą pola, które ma opcje.
W swoim szablonie zrób to:
źródło