it-swarm.com.de

Django: Zugriff auf gegebenes Feldtupel

Ich möchte die benannten Werte eines Auswahlfelds für eine Auswahl erhalten, die derzeit nicht ausgewählt ist. Ist das möglich?

Zum Beispiel: 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

Wie kann ich den alten Anzeigewert von 'P' auf 'Ausstehend' setzen? Ich kann dazu in der Lage sein, ein Formular in der Ansicht zu erstellen und auf sein Wörterbuch der Werte/Bezeichnungen zuzugreifen. Ist dies der beste/einzige Ansatz?

23
Furbeenator

Dies ist ziemlich in Ordnung, um Ihr Auswahl-Mapping FILE_STATUS_CHOICES von Modellen zu importieren und es zu verwenden, um Pending durch P zu erhalten:

from my_app.models import FILE_STATUS_CHOICES

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

Die get_FIELD_display()-Methode Ihres Modells macht im Wesentlichen dasselbe:

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

Da es im Modellfeld ein flatchoices-Feld gibt, können Sie es mithilfe der _meta- und get_field_by_name()-Methode verwenden:

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

dabei ist f Ihre Modellinstanz.

Siehe auch:

44
alecxe

Ich empfehle die Verwendung von Choice aus Django-model-utils: https://Django-model-utils.readthedocs.io/de/latest/utilities.html#choices .

Ich verwende es in jedem meiner Modelle, wenn ich ein Auswahlfeld brauche. Siehe Beispiele, es hat ausgezeichnete Optionen.

0
Ibrohim Ermatov