首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

带有Django Rest Auth的自定义注册表单-错误: save()采用1个位置参数,但给出了2个

在使用Django Rest Framework (DRF) 和 Django Rest Auth 进行自定义注册表单时,如果你遇到错误信息 save() takes 1 positional argument but 2 were given,这通常是因为你在重写的 save() 方法中没有正确地调用父类的 save() 方法。

基础概念

Django Rest Auth 是一个用于 Django REST framework 的库,它提供了用户认证的功能,包括注册、登录、密码重置等。自定义注册表单允许你根据项目需求定制注册逻辑。

错误原因

这个错误的原因是你重写的 save() 方法没有接受 commit 参数。在 Django 中,Model.save() 方法默认接受两个参数:selfcommit。当你重写这个方法时,需要确保也接受这两个参数,并且正确地调用父类的 save() 方法。

解决方法

以下是一个示例,展示如何正确地重写 save() 方法:

代码语言:txt
复制
from rest_framework import serializers
from rest_auth.registration.serializers import RegisterSerializer
from django.contrib.auth.models import User

class CustomRegisterSerializer(RegisterSerializer):
    # 添加自定义字段
    first_name = serializers.CharField(required=True)
    last_name = serializers.CharField(required=True)

    def get_cleaned_data(self):
        return {
            'username': self.validated_data.get('username', ''),
            'password1': self.validated_data.get('password1', ''),
            'email': self.validated_data.get('email', ''),
            'first_name': self.validated_data.get('first_name', ''),
            'last_name': self.validated_data.get('last_name', '')
        }

    def save(self, request):
        user = super().save(request)  # 调用父类的 save 方法
        user.first_name = self.cleaned_data.get('first_name')
        user.last_name = self.cleaned_data.get('last_name')
        user.save()
        return user

应用场景

自定义注册表单在以下场景中非常有用:

  1. 多字段注册:除了标准的用户名、密码和电子邮件外,还需要用户提供其他信息,如姓名、地址等。
  2. 数据验证:在保存用户数据之前进行额外的数据验证。
  3. 集成第三方服务:在用户注册时,可能需要与第三方服务进行集成,如发送欢迎邮件、短信验证等。

参考链接

通过以上方法,你可以解决 save() takes 1 positional argument but 2 were given 错误,并成功实现自定义注册表单。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的沙龙

领券