Как отобразить пользователю текст поля ChoiceField через шаблон Django?
models.py:
class Person(models.Model):
title=models.CharField(max_length=11)
name=models.CharField(max_length=100)
gender=models.CharField(max_length=11)
forms.py:
class PersonForm(ModelForm):
GENDER_SELECT = (
('f', 'Female'),
('m', 'Male'),
('o', 'Other'),
)
TITLE_SELECT = (
('0', 'Mr.'),
('1', 'Mrs.'),
('2', 'Ms.'),
('3', 'Mast.'),
)
title=forms.CharField(widget=forms.RadioSelect(choices=TITLE_SELECT, attrs={'class': 'form-check-inline'}))
gender=forms.CharField(widget=forms.RadioSelect(choices=GENDER_SELECT, attrs={'class': 'form-check-inline'}))
class Meta:
model=Person
fields='__all__'
Ниже приведены два способа, с помощью которых я пытался вывести данные на веб-страницу, но первый способ ничего не возвращает, а второй способ возвращает значение базы данных выбора, а не текст, который выбрал пользователь. Я хочу, чтобы пользователь видел Mr. или Mrs. или Ms. или Mast. а не 0/1/2/3. Что здесь не так?
template:
1
{% for rp in report %}
<td class="design">{% if rp.title == 0 %} Mr. {% elif rp.title == 1 %} Mrs. {% elif rp.title == 2 %} Ms. {% elif rp.title == 3 %} Mast. {% endif %}</td>
{% endfor %}
2
{% for rp in report %}
<td class="design">{{rp.title}}</td>
{% endfor %}
Первое решение не работает, потому что title
является str
и вы сравниваете его с целыми числами. Ниже будет работать:
{% for rp in report %}
<p>
{% if rp.title == '0' %}
Mr.
{% elif rp.title == '1' %}
Mrs.
{% elif rp.title == '2' %}
Ms.
{% elif rp.title == '3' %}
Mast.
{% endif %}
</p>
{% endfor %}
Лучшее решение - создать тег шаблона .
# templatetags/report_tags.py
from django import template
register = template.Library()
titles = {
'0': 'Mr.',
'1': 'Mrs.',
'2': 'Ms.',
'3': 'Mast.',
}
@register.simple_tag
def person_title(title):
return titles.get(title)
А внутри вашего шаблона:
{% load report_tags %}
{% for rp in report %}
<td class="design">
{% person_title rp.title %}
</td>
{% endfor %}
Намного чище!