5 votes

Le panneau d'administration de Django ne peut pas définir un choix valide lorsque les choix sont des enum.Enum

J'utilise enum.Enum comme choix pour la langue du champ.

Je peux créer un livre en b = Book(title="Some Title", language=LanguageChoice.EN) .

Et interrogation par books = Book.objects.filter(languge=LanguageChoice.EN) .

Cependant Lorsque je veux créer de nouveaux livres dans le panneau d'administration, le message suivant s'affiche Select a valid choice. LanguageChoice.EN is not one of the available choices. .

Django a possibilité de sérialiser enum.Enum depuis la version 1.10. Comment doit fonctionner le panneau d'administration ? Merci d'avance.

from enum import Enum
from django.db import models

class LanguageChoice(Enum):
    DE = "German"
    EN = "English"
    CN = "Chinese"
    ES = "Spanish"

class Book(models.Model):
    title = models.CharField(max_length=255)
    language = models.CharField(
        max_length=5,
        choices=[(tag, tag.value) for tag in LanguageChoice]  
    )

2voto

jrief Points 261

Vous devez réécrire votre modèle Django en tant que

class LanguageChoice(Enum):
    DE = "German"
    EN = "English"
    CN = "Chinese"
    ES = "Spanish"

    @classmethod
    def all(self):
        return [LanguageChoice.DE, LanguageChoice.EN, LanguageChoice.CN, LanguageChoice.ES]

class Book(models.Model):
    title = models.CharField(max_length=255)
    language = models.CharField(
        max_length=5,
        choices=[(tag.value, tag.name) for tag in LanguageChoice.all()]  
    )

1voto

Dalvtor Points 874

Je viens de rencontrer ce problème. Réécrivez votre Book comme suit, et remarquez le changement dans la ligne de choix.

class Book(models.Model):
    title = models.CharField(max_length=255)
    language = models.CharField(
        max_length=5,
        choices=[(tag.name, tag.value) for tag in LanguageChoice]  
    )

-4voto

J'ai changé (tag,tag.value) a (tag.value,tag) et cela a fonctionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X