web-dev-qa-db-fra.com

Django: Accédez au tuple de choix de champs

Je voudrais obtenir les valeurs nommées d'un champ de choix pour un choix qui n'est pas actuellement sélectionné. Est-ce possible?

Par exemple: 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

Comment puis-je obtenir l'ancienne valeur d'affichage de «P» à «En attente»? Pour ce faire, je peux créer un formulaire dans la vue et accéder à son dictionnaire de valeurs/étiquettes. Est-ce la meilleure/seule approche?

23
Furbeenator

C’est à peu près correct d’importer votre mappage de choix FILE_STATUS_CHOICES depuis des modèles et de l’utiliser pour obtenir Pending par P:

from my_app.models import FILE_STATUS_CHOICES

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

La méthode get_FIELD_display() de votre modèle fait essentiellement la même chose:

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

Et, puisqu'il existe un champ flatchoices sur le champ du modèle, vous pouvez l'utiliser à l'aide de la méthode _meta et get_field_by_name():

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

f est votre instance de modèle.

Regarde aussi:

44
alecxe

Je recommande d'utiliser Choice à partir de Django-model-utils: https://Django-model-utils.readthedocs.io/en/latest/utilities.html#choices .

Je l'utilise dans tous mes modèles si j'ai besoin d'un champ de choix. Voir des exemples, il a d'excellentes options.

0
Ibrohim Ermatov