ChatGPT解决这个技术问题 Extra ChatGPT

Django: Display Choice Value

models.py:

class Person(models.Model):
    name = models.CharField(max_length=200)
    CATEGORY_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    gender = models.CharField(max_length=200, choices=CATEGORY_CHOICES)
    to_be_listed = models.BooleanField(default=True)
    description = models.CharField(max_length=20000, blank=True)

views.py:

def index(request):
    latest_person_list2 = Person.objects.filter(to_be_listed=True)
    return object_list(request, template_name='polls/schol.html',
                       queryset=latest_person_list, paginate_by=5)

On the template, when I call person.gender, I get 'M' or 'F' instead of 'Male' or 'Female'.

How to display the value ('Male' or 'Female') instead of the code ('M'/'F')?

possible duplicate of Django print choices value
I tried this method, In my template I am using: {% for person in object_list %} some html {{person.get_gender_display() }} html {% endfor %} I am getting the following error: Exception Value: Could not parse the remainder: '()' from 'person.get_gender_display()'
My Bad, I should not have included '()' after person.get_gender_display. Its working now. Thanks.
Just a little comment, since gender will only be either M or F(1 character lenght) it has no sense setting the max length of the charfield to 200. With max_lenght=1 is enough, will make your site more efficient and you will ensure that you wont have wrong data. :)

d
daaawx

It looks like you were on the right track - get_FOO_display() is most certainly what you want:

In templates, you don't include () in the name of a method. Do the following:

{{ person.get_gender_display }}

This method is priceless. But aside using the method, what's the way to retrieve the value stored in say, {{ i.item.what_to_put_here}} ?
Just to note, for anyone using Jinja2 for their templates, you should include the parentheses. {{ person.get_gender_display() }}
Bonus points: what's the best way to do this if you're sending your information via JSON (for instance in a pagination scenario)? Ideally without the overhead of instantiating the Models one by one and calling get_field_display().
Gotta love Django, almost 10 years later and the answer is still valid! Thx +1 and drink on me.
Somehow this doesn't fetch the translated text. Any idea on how to get the translated text if i18 is already implemented on the website?
M
Muhammad Faizan Fareed

For every field that has choices set, the object will have a get_FOO_display() method, where FOO is the name of the field. This method returns the “human-readable” value of the field.

In Views

person = Person.objects.filter(to_be_listed=True)
context['gender'] = person.get_gender_display()

In Template

{{ person.get_gender_display }}

Documentation of get_FOO_display()


D
Daniel O'Brien

Others have pointed out that a get_FOO_display method is what you need. I'm using this:

def get_type(self):
    return [i[1] for i in Item._meta.get_field('type').choices if i[0] == self.type][0]

which iterates over all of the choices that a particular item has until it finds the one that matches the items type


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now