Django: Access given field's choices tuple

30,491

This is pretty much ok to import your choice mapping FILE_STATUS_CHOICES from models and use it to get Pending by P:

from my_app.models import FILE_STATUS_CHOICES

print dict(FILE_STATUS_CHOICES).get('P')

get_FIELD_display() method on your model is doing essentially the same thing:

def _get_FIELD_display(self, field):
    value = getattr(self, field.attname)
    return force_text(dict(field.flatchoices).get(value, value), strings_only=True) 

And, since there is a flatchoices field on the model field, you can use it with the help of _meta and get_field_by_name() method:

choices = f._meta.get_field_by_name('name')[0].flatchoices
print dict(choices).get('P')

where f is your model instance.

Also see:

Share:
30,491
Furbeenator
Author by

Furbeenator

MS Computer Science from University of Illinois, Springfield. 10+ years experience with software engineering in various languages. Most recent project using Django/Python/PostgreSQL for corporate intranet web application.

Updated on August 22, 2020

Comments

  • Furbeenator
    Furbeenator almost 4 years

    I would like to get the named values of a choices field for a choice that is not currently selected. Is this possible?

    For instance: models.py

    FILE_STATUS_CHOICES = (
        ('P', 'Pending'),
        ('A', 'Approved'),
        ('R', 'Rejected'),
    )
    
    class File(models.Model):
        status = models.CharField(max_length=1, default='P', choices=FILE_STATUS_CHOICES)
    

    views.py

    f = File()
    f.status = 'P'
    f.save()
    
    old_value = f.status
    
    print f.get_status_display()
    > Pending
    
    f.status = 'A'
    f.save()
    
    new_value = f.status
    
    print f.get_status_display()
    > Approved
    

    How can I get the old display value from the 'P' to 'Pending?' I may be able to do so by creating a form in the view and accessing its dictionary of values/labels. Is this the best/only approach?

  • Furbeenator
    Furbeenator almost 11 years
    The flatchoices is part of a form element? When I do it against the actual file object, status returns the single-character unicode 'P' which doesn't seem to have a flatchoices property. If that's the case, I can set up a form and then get the flatchoices from there, right?
  • alecxe
    alecxe almost 11 years
    @Furbeenator yeah, right, sorry, should get the actual field first: check the updated answer.
  • Furbeenator
    Furbeenator almost 11 years
    Awesome, I figured this out and then saw your update. Thanks a bunch, this gets me out of a jam!
  • pitchblack408
    pitchblack408 about 7 years
    How do you access them in a template?