Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Rest Auth:注册时需要另一个字段_Django_Django Rest Framework_Django Allauth_Django Rest Auth - Fatal编程技术网

Django Rest Auth:注册时需要另一个字段

Django Rest Auth:注册时需要另一个字段,django,django-rest-framework,django-allauth,django-rest-auth,Django,Django Rest Framework,Django Allauth,Django Rest Auth,我正在使用Django管理一些用户数据。我想让这些数据背后的人能够通过注册并将他们的帐户连接到现有数据(立即)来查看这些数据 因此,我会给他们一个身份验证令牌,打印在一张纸上,为了将他们已经存在的数据连接到他们的帐户,他们必须发送该令牌以及他们想要的用户名、电子邮件、密码等 我的Userdata模型如下所示: class Userdata(models.Model): number = models.IntegerField(primary_key=True) first_nam

我正在使用Django管理一些用户数据。我想让这些数据背后的人能够通过注册并将他们的帐户连接到现有数据(立即)来查看这些数据

因此,我会给他们一个身份验证令牌,打印在一张纸上,为了将他们已经存在的数据连接到他们的帐户,他们必须发送该令牌以及他们想要的用户名、电子邮件、密码等

我的Userdata模型如下所示:

class Userdata(models.Model):
    number = models.IntegerField(primary_key=True)
    first_name = models.CharField(max_length=128)
    last_name = models.CharField(max_length=128)
    useraccount = models.OneToOneField(get_user_model())
    auth_token = models.CharField(max_length=12, default="DUMMY", unique=True)
因此,我想更改注册过程,使用djang rest auth和allauth检查
userdata
表中是否存在一行,其中
auth_令牌等于注册时提供的令牌

如果,则我想将此行中的
useraccount
字段设置为新创建的帐户,如果不是,则我想引发错误并停止帐户注册


我现在完全迷路了,不知道从哪里开始。我真的会把任何暗示传达到正确的方向


谢谢大家!

您需要覆盖序列化程序中的验证方法

 class RegisterSerializer(serializers.Serializer)
我猜你在用 然后覆盖序列化程序

 class RegisterSerializer(serializers.Serializer)
哪个在
文件

多亏了@somil,我终于想出了以下可行但不干净的解决方案

from rest_auth.registration.serializers import RegisterSerializer
from apps.FOOBAR.models import Userdata

# ...

class TokenRegisterSerializer(RegisterSerializer):
    pass

    # adding the token field to the default serializer
    token = serializers.CharField(write_only=True)

    # adding a token validator: check if there is a userdata with this token
    def validate_token(self, token):
        try:
            Userdata.objects.get(auth_token=token)
            return token
        except Patient.DoesNotExist:
            raise serializers.ValidationError(
                "Token seems to be invalid, try again")

    # this method is called at save
    def custom_signup(self, request, user):
        # connect the data with the user
        data = Userdata.objects.get(
            auth_token=self.validated_data.get('token', ''))
        data.useraccount = user
        data.save()
并且,在
settings.py中

REST_AUTH_REGISTER_SERIALIZERS = {
    'REGISTER_SERIALIZER': 'apps.api.serializers.TokenRegisterSerializer',
}

到目前为止,谢谢你,我会再深入一点。RegisterSerializer中的自定义注册方法是专门被覆盖的,所以我认为这根本不是一种肮脏的方法。我想这正是你应该做的。