Django: Access given field's choices tuple
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:
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, 2020Comments
-
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 almost 11 yearsThe 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 almost 11 years@Furbeenator yeah, right, sorry, should get the actual field first: check the updated answer.
-
Furbeenator almost 11 yearsAwesome, I figured this out and then saw your update. Thanks a bunch, this gets me out of a jam!
-
pitchblack408 about 7 yearsHow do you access them in a template?