我正在使用django-睡觉-auth和allauth在我的django应用程序中登录和注册.我自己没有为登录或注册编写任何额外的代码行.使用邮箱ID和提供的密码注册成功.

我没有使用用户名进行身份验证,而是使用邮箱.

在我可浏览的注册api中,我得到以下信息:

enter image description here

除了这些字段之外,我还希望有first_name和last_name(默认的auth_user表中有这些列),这样我新创建的auth_user也可以设置这些字段以及邮箱和哈希密码.

我怎样才能做到这一点?这个可浏览表单本身并不重要,但能够存储名字和姓氏是我主要需要的.

推荐答案

  1. 确保你的settings.py文件中有ACCOUNT_USERNAME_REQUIRED = False个.

  2. 对于first_namelast_name,您需要编写自定义RegisterSerializer(https://github.com/Tivix/django-rest-auth/blob/master/rest_auth/registration/serializers.py#L166)

以下是serializers.py的示例代码

from allauth.account import app_settings as allauth_settings
from allauth.utils import email_address_exists
from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email

class RegisterSerializer(serializers.Serializer):
    email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
    first_name = serializers.CharField(required=True, write_only=True)
    last_name = serializers.CharField(required=True, write_only=True)
    password1 = serializers.CharField(required=True, write_only=True)
    password2 = serializers.CharField(required=True, write_only=True)

    def validate_email(self, email):
        email = get_adapter().clean_email(email)
        if allauth_settings.UNIQUE_EMAIL:
            if email and email_address_exists(email):
                raise serializers.ValidationError(
                    _("A user is already registered with this e-mail address."))
        return email

    def validate_password1(self, password):
        return get_adapter().clean_password(password)

    def validate(self, data):
        if data['password1'] != data['password2']:
            raise serializers.ValidationError(
                _("The two password fields didn't match."))
        return data

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

    def save(self, request):
        adapter = get_adapter()
        user = adapter.new_user(request)
        self.cleaned_data = self.get_cleaned_data()
        adapter.save_user(request, user, self)
        setup_user_email(request, user, [])
        user.save()
        return user
  1. settings.py中,确保添加引用新的串行化程序.

    REST_AUTH_REGISTER_SERIALIZERS = {
            'REGISTER_SERIALIZER': 'path.to.RegisterSerializer',
    }
    

Django相关问答推荐

访问默认的 django-allauth 登录和注册页面时出现 TemplateSyntaxError

Django ORM:获取每个类别的月平均价格

使用 Python/Django 上传大文件

Django ORM 和锁定表

在 PyCharm 中运行 Django 测试

使用移动应用程序保护通信 [真实性、隐私和完整性]?

有没有办法将变量传递给 Django 中的 extended模板?

Django - 在模板中显示当前日期和时间

通过 django shell 保存图像/文件

可以在 github 页面上托管 django 站点吗?

使用 Python / Django 的 Google API 示例的 Oauth

Django 删除未使用的媒体文件

Django模板转义

保存前向 ModelForm 对象添加数据

Django将HttpResponseRedirect返回到带有参数的url

Django 应用程序运行良好,但收到 TEMPLATE_* 警告消息

如何在 Django 中更改上传文件的文件名?

Jinja2中的多级模板继承?

Django 中的自定义 HTTP 标头

Django - 保存新对象时如何获取 self.id?