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?
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')
où f
est votre instance de modèle.
Regarde aussi:
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.