我正在使用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
字段设置为新创建的帐户,如果不是,那么我想提出一个错误并停止该帐户的注册。
此刻我完全迷失了方向,不知道从哪里开始。我真的会向正确的方向提出任何建议。
谢谢!
答案 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',
}