Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: Access given field's choices tuple

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?

like image 499
Furbeenator Avatar asked Sep 09 '13 20:09

Furbeenator


1 Answers

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:

  • Django get display name choices
like image 167
alecxe Avatar answered Oct 03 '22 10:10

alecxe