Django-Rest-Auth:注册时需要其他字段

时间:2019-07-19 07:41:19

标签: django django-rest-framework django-allauth django-rest-auth

我正在使用Django管理一些用户数据。我想为那些数据背后的人提供一次查看的可能性,方法是将他们的帐户注册并连接到现有数据(一次)。

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

我的用户数据模型如下:

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_token等于注册时提供的行

如果,那么我想将此行中的useraccount字段设置为新创建的帐户,如果不是,那么我想提出一个错误并停止该帐户的注册。


此刻我完全迷失了方向,不知道从哪里开始。我真的会向正确的方向提出任何建议。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

我想您正在使用https://github.com/Tivix/django-rest-auth/ 然后覆盖序列化器

<Grid BackgroundColor="Black Padding="10,10,0,10" >
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
   <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
   </Grid.ColumnDefinitions>
   <Button Text="XXX" 
            Command="{Binding SignUpCommand}" 
            WidthRequest="100" HeightRequest="70"
            Grid.Row="0" Grid.Column="0"  Style="{StaticResource GrayButton} " / >

其中 https://github.com/Tivix/django-rest-auth/blob/master/rest_auth/registration/serializers.py个文件

答案 1 :(得分:0)

由于@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',
}