Django: Access given field's choices tuple
Question:
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?
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:
I recommend using Choice
from django-model-utils
: https://django-model-utils.readthedocs.io/en/latest/utilities.html#choices.
I use it in every my models if I need choice field. See examples, it has excellent options.
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:
I recommend using Choice
from django-model-utils
: https://django-model-utils.readthedocs.io/en/latest/utilities.html#choices.
I use it in every my models if I need choice field. See examples, it has excellent options.