【问题标题】:Django admin panel can not set valid choice when choices are enum.EnumDjango admin panel can not set valid choice when choices are enum.Enum
【发布时间】:2018-12-01 03:48:53
【问题描述】:

我使用 enum.Enum 作为字段语言的选择。

我可以通过b = Book(title="Some Title", language=LanguageChoice.EN)创建一本书。

并通过books = Book.objects.filter(languge=LanguageChoice.EN)查询。

但是,当我想在管理面板上创建新书时,它会显示Select a valid choice. LanguageChoice.EN is not one of the available choices.

Django 从 1.10 开始就有ability to serialize enum.Enum。那么管理面板应该如何工作呢?谢谢。

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]  
    )

【问题讨论】:

  • 序列化它们的能力并不意味着将它们用作选择值的能力。

标签: django enums django-admin models


【解决方案1】:

我刚遇到这个问题。将您的Book 模型重写如下,并注意选择行的变化。

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]  
    )

【讨论】:

    【解决方案2】:

    你应该将你的 Django 模型重写为

    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()]  
        )
    

    【讨论】:

    • 枚举没有all()
    • 只需将(tag, tag.value) 更改为(tag.name, tag.value) 就足够了。不需要其余的更改。
    【解决方案3】:

    我将(tag,tag.value) 更改为(tag.value,tag) 并且成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-27
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多