首页 > 解决方案 > 如何在 django restframework 中从 allauth 的 EmailAddress 模型为用户电子邮件创建 ChoiceField?

问题描述

我在 API 的后端使用 django allauth 和 restframework。我的问题是如何在我的序列化程序中使用登录用户的电子邮件地址作为值创建一个 ChoiceField,以便表单将为电子邮件字段创建一个 Select 字段,而不是文本字段。

到目前为止,我已经AuthUserSerializer为我的用户 API 创建了一个序列化程序。

用户/序列化程序.py

from rest_framework import serializers
from users.models import *

emails = [(email.email, email.email) for email in EmailAddress.objects.all()]

class AuthUserSerializer(serializers.ModelSerializer):
    email = serializers.ChoiceField(choices=emails)

    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'email', 'avatar',
            'bio', 'country', 'is_staff', 'is_active', 'is_superuser', 'last_login',
            'date_joined')
        extra_kwargs = {
            'is_staff': { 'read_only': True },
            'is_superuser': { 'read_only': True },
            'last_login': { 'read_only': True },
            'date_joined': { 'read_only': True }
        }

ChoiceField在上面的代码中将电子邮件字段初始化为 a ,选择是从EmailAddress模型中获得的电子邮件。

但我想获取请求的用户创建的电子邮件。我不知道该怎么做。

我尝试在下面创建一个CustomChoiceField类似的,但它仍然不起作用。

class CustomChoiceField(serializers.ChoiceField):
    def __init__(self, **kwargs):
        user = self.context.get('request').user
        emails = [(email.email, email.email) for email in EmailAddress.objects.filter(user=user)]
        super().__init__(emails, **kwargs)

class AuthUserSerializer(serializers.ModelSerializer):
    email = ChoiceField()
    
    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'email', 'avatar',
            'bio', 'country', 'is_staff', 'is_active', 'is_superuser', 'last_login',
            'date_joined')
        extra_kwargs = {
            'is_staff': { 'read_only': True },
            'is_superuser': { 'read_only': True },
            'last_login': { 'read_only': True },
            'date_joined': { 'read_only': True }
        }

用户/views.py

from base.views import CustomModelViewSet
from users.models import *
 
class AuthUserViewset(CustomModelViewSet):
    serializer_class = AuthUserSerializer
    pagination_class = None

    def get_queryset(self):
        queryset = User.objects.filter(id=self.request.user.id)
        return queryset

我不明白我在这里做错了什么。

更新

下图显示电子邮件字段作为文本输入。

在此处输入图像描述

但我想显示用户添加的所有电子邮件的下拉列表,如下所示,但他们各自的电子邮件不是所有的电子邮件。

在此处输入图像描述

标签: pythondjangodjango-rest-framework

解决方案


选项字段中的选项不正确。Django 在模型中提供 Emailfield。在按用户 ID 获取 api 调用过滤器模型期间使用它。(如果用户可以有多个电子邮件地址,否则您也可以定义一对一的字段。)

您的模型应如下所示:

class AuthUserSerializer(serializers.ModelSerializer):
    email = models.EmailField()
    user = models.ForeignKey(model=UserModel, ...)
    class Meta:
        model = User
        fields = '__all__'

如果是一对一的电子邮件 ID:

Class UserModel:
    name = ...
    other_fields = ...
    email = ....

并根据您的要求应用过滤器。


推荐阅读