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?
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With