Saya punya model:
from django.db import models
CHOICES = (
('s', 'Glorious spam'),
('e', 'Fabulous eggs'),
)
class MealOrder(models.Model):
meal = models.CharField(max_length=8, choices=CHOICES)
Saya punya formulir:
from django.forms import ModelForm
class MealOrderForm(ModelForm):
class Meta:
model = MealOrder
Dan saya ingin menggunakan formtools.preview. Template default mencetak versi pendek dari pilihan ('e' bukannya 'Fabulous eggs'), karena itu digunakan
{% for field in form %}
<tr>
<th>{{ field.label }}:</th>
<td>{{ field.data }}</td>
</tr>
{% endfor %}.
Saya ingin template yang umum seperti yang disebutkan, tetapi mencetak 'Telur yang luar biasa' sebagai gantinya.
[Karena saya ragu di mana pertanyaan sebenarnya, saya berani untuk kita semua :)]
Saya tahu cara mendapatkan versi verbose dari suatu pilihan dengan cara yang jelek:
{{ form.meal.field.choices.1.1 }}
Rasa sakit yang sebenarnya adalah saya harus mendapatkan pilihan yang dipilih, dan satu-satunya cara datang ke pikiran saya adalah beralih melalui pilihan dan memeriksa {% ifequals currentChoice.0 choiceField.data %}
, yang bahkan lebih buruk.
Bisakah itu dilakukan dengan mudah? Atau perlu beberapa pemrograman template-tag? Bukankah seharusnya itu sudah tersedia di Django?
sumber
Solusi terbaik untuk masalah Anda adalah menggunakan fungsi pembantu. Jika pilihan disimpan dalam PILIHAN variabel dan bidang model menyimpan pilihan yang dipilih adalah ' pilihan ' maka Anda dapat langsung menggunakan
di templat Anda. Di sini, x adalah contoh model. Semoga ini bisa membantu.
sumber
Saya minta maaf jika jawaban ini berlebihan dengan yang tercantum di atas, tetapi tampaknya jawaban ini belum ditawarkan, dan tampaknya cukup bersih. Inilah cara saya memecahkan ini:
Tampilan saya meneruskan Scoop ke templat (note: not Scoop.values ()), dan templat tersebut berisi:
sumber
Mendasarkan pada jawaban Nuh, inilah versi yang kebal terhadap ladang tanpa pilihan:
Saya tidak yakin apakah boleh menggunakan filter untuk tujuan seperti itu. Jika ada yang punya solusi yang lebih baik, saya akan senang melihatnya :) Terima kasih Nuh!
sumber
Kami dapat memperluas solusi filter oleh Nuh agar lebih universal dalam menangani data dan tipe bidang:
Berikut kodenya:
sumber
Saya tidak berpikir ada cara bawaan untuk melakukan itu. Namun, filter dapat melakukan trik:
Maka Anda dapat melakukan:
sumber
Tambahkan ke models.py Anda satu fungsi sederhana:
Sekarang, Anda bisa mendapatkan nilai verbose dari bidang pilihan seperti itu:
Upd .: Saya tidak yakin, apakah solusi itu "pythonic" dan "django-way" cukup atau tidak, tetapi berhasil. :)
sumber
Anda memiliki Model.get_FOO_display () di mana FOO adalah nama bidang yang memiliki pilihan.
Dalam templat Anda, lakukan ini:
sumber