python - 如何在 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
我不明白我在这里做错了什么。
更新
下图显示电子邮件字段作为文本输入。
但我想显示用户添加的所有电子邮件的下拉列表,如下所示,但他们各自的电子邮件不是所有的电子邮件。
解决方案
选项字段中的选项不正确。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 = ....
并根据您的要求应用过滤器。
推荐阅读
- fullcalendar - Fullcalendar 4:如何在 fullcalendar 上获取已删除事件的元素引用?
- c# - 如何在 Angular 和 C# 中编写 post 方法?
- asynchronous - Flutter 动态标签栏渲染(异步)
- java - 在注入的类中注入一个接口的不同实现
- angular - 角度导航到具有多个参数的路由
- android - 如何在 Window 上获得正确的可用尺寸(没有所有装饰元素)?
- bash - 遍历行并检查特定值
- ruby - Coinbase Pro API “无效签名” RUBY
- angular-http-interceptors - jwt -interceptor 不会拦截来自一个 Angular 服务的 API 调用 - 而其他所有服务都可以
- gis - GeoServer 重复渲染 (EPSG:4326)