0

我正在尝试使用 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)

但是在管理控制台上,我看到了这些字段,而不是字符串项: 在此处输入图像描述

但是,当我单击 email_addres 查看用户详细信息时,出现以下错误: 在此处输入图像描述

编辑:这是我的 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', 'is_staff', 'edumap_roles')
    search_fields = ('email', 'first_name', 'last_name')
    ordering = ('email',)
    readonly_fields = ['created_at', 'updated_at']

我的其余框架版本是:3.11.0。我想补充什么吗?

4

2 回答 2

0

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

from django.db import models


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

注意:不要忘记运行manage.py makemigrations并将manage.py migrate新更改应用到数据库。在性能的情况下,您还可以将其更改为edumap_roles

class User(AbstractUser):
    CHOICES = (
        (1, 'Can Publish programs'),
        (2, 'Can author programs')
    )
    email = models.EmailField(verbose_name=_('email address'), unique=True)
    edumap_roles = models.PositiveSmallIntegerField(choices=CHOICES)
于 2020-08-11T07:34:02.960 回答
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/ (有不同类型的表单,但 ModelForm 在这里似乎合适)
https://docs.djangoproject.com/en/3.1/ref/forms/widgets/#module-django.forms.widgets

于 2020-08-11T07:30:17.157 回答