modelos.py:
class Person(models.Model): title=models.CharField(max_length=11) name=models.CharField(max_length=100) gender=models.CharField(max_length=11)formularios.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__'Ahora, a continuación se muestran las dos formas en que traté de obtener la salida de datos a la página web, pero la primera no devuelve nada y la segunda devuelve el valor de la base de datos de la elección, en lugar del texto que el usuario seleccionó. Quiero que el usuario vea Sr. o Sra. o Sra. o Mast. y no 0/1/2/3. ¿Que esta mal aquí?
modelo:
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 %}La primera solución no funciona porque el title es una str y lo está comparando con números enteros. A continuación funcionará:
{% 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 %}Una mejor solución es crear una etiqueta de plantilla .
# 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)Y dentro de tu plantilla:
{% load report_tags %} {% for rp in report %} <td class="design"> {% person_title rp.title %} </td> {% endfor %}¡Mucho más limpio!