在Django rest框架中获取MultipleChoiceField的FieldError

如何解决在Django rest框架中获取MultipleChoiceField的FieldError

我正在尝试使用django Rest Framework字段中的MultipleChoiceField,如此链接中所述: https://pypi.org/project/django-multiselectfield/

我的一部分代码如下:

from rest_framework import fields
CHOICES = (
    ('publisher','Can Publish programs'),('author','Can author programs')
)

class User(AbstractUser):
  email = EmailField(verbose_name=_('email address'),unique=True)
  edumap_roles = fields.MultipleChoiceField(choices=CHOICES,allow_blank=True)

但是在管理控制台上,我看到这些字段而不是字符串项:

enter image description here

但是,当我单击email_addres以查看用户详细信息时,出现以下错误:

enter image description here

编辑: 这是我的UserAdmin类

@register(User)
class UserAdmin(CustomAdmin):
    """Define admin model for custom User model with no email field."""
    fieldsets = (
        (None,{'fields': ('email','password')}),(_('Personal info'),{'fields': ('first_name','last_name')}),(_('Permissions'),{'fields': ('is_active','is_staff','is_superuser','groups','user_permissions','edumap_roles')}),(_('Important dates'),{'fields': ('last_login','date_joined','created_at','updated_at')}),)
    add_fieldsets = (
        (None,{
            'classes': ('wide',),'fields': ('email','password1','password2'),}),)
    list_display = ('email','first_name','last_name','edumap_roles')
    search_fields = ('email','last_name')
    ordering = ('email',)
    readonly_fields = ['created_at','updated_at']

我的其余框架版本是:3.11.0。我是否想添加任何东西?

解决方法

当然,数据库域中不存在“多选字段”。在幕后,这就像一个CharField,但有一些额外的序列化。这意味着在模型定义中,我们需要这样定义它:

CHOICES = (
    ('publisher','Can Publish programs'),('author','Can author programs')
)

class User(AbstractUser):
    email = EmailField(verbose_name=_('email address'),unique=True)
    edumap_roles = models.CharField(choices=CHOICES,null=True,blank=False)

但是,Django尚不知道这需要多项选择。我们需要为此创建一个表单。在表格中,我们可以指定每种字段应使用哪种widget。例如。我们可以指定它应该使用textarea而不是普通的文本输入。您的表格可能类似于:

class UserForm(forms.ModelForm):
    edumap_roles = forms.MultipleChoiceField(widget=forms.SelectMultiple,choices=choices)
    class Meta:
        model = User
        fields = [
            'email','edumap_roles','password1','password2','...',]
    

请注意,我们只需要为我们要覆盖的字段指定小部件。其他小部件会自动解决。

然后在您的UserAdmin中可以执行以下操作:

@register(User)
class UserAdmin(CustomAdmin):
    ...
    form = UserForm

表单和窗口小部件是“管理”部分的重要组成部分,您可以在此处阅读更多内容: https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/(有不同类型的表单,但是在这里ModelModel似乎合适)
https://docs.djangoproject.com/en/3.1/ref/forms/widgets/#module-django.forms.widgets

,

如果要在数据库中保存数据状态,则必须使用Django字段。您可以使用Django CharField代替rest_framework字段来解决问题。您可以使用以下代码代替当前字段:

from django.db import models


class User(AbstractUser):
    CHOICES = (
        ('publisher','Can author programs')
    )
    email = models.EmailField(verbose_name=_('email address'),unique=True)
    edumap_roles = models.CharField(choices=CHOICES)

注意:不要忘记运行manage.py makemigrationsmanage.py migrate将新更改应用到数据库。 为了提高性能,您还可以将edumap_roles更改为以下内容:

class User(AbstractUser):
    CHOICES = (
        (1,(2,unique=True)
    edumap_roles = models.PositiveSmallIntegerField(choices=CHOICES)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?