from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
department = models.CharField(max_length=5)
university = models.CharField(max_length=100)
reg_no = models.CharField(max_length=10, blank=True, null=True)
不要忘记编辑admin.py这个应用程序的www.example.com:
from django.contrib import admin
from .models import CustomUser
admin.site.register(CustomUser)
创建一个serializers.py并编辑以下内容:
from dj_rest_auth.serializers import UserDetailsSerializer
from rest_framework import serializers
from django.conf import settings
from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email
from dj_rest_auth.registration.serializers import RegisterSerializer
class CustomRegisterSerializer(RegisterSerializer):
reg_no = serializers.CharField(max_length=10)
department = serializers.CharField(required=True, max_length=5)
university = serializers.CharField(required=True, max_length=100)
def get_cleaned_data(self):
data_dict = super().get_cleaned_data()
data_dict['reg_no'] = self.validated_data.get('reg_no', '')
data_dict['department'] = self.validated_data.get('department', '')
data_dict['university'] = self.validated_data.get('university', '')
return data_dict
class CustomUserDetailsSerializer(UserDetailsSerializer):
class Meta(UserDetailsSerializer.Meta):
fields = UserDetailsSerializer.Meta.fields + \
('reg_no', 'is_staff', 'department', 'university',)
您还必须添加adapter.py并添加以下代码:
from allauth.account.adapter import DefaultAccountAdapter
class CustomAccountAdapter(DefaultAccountAdapter):
def save_user(self, request, user, form, commit=False):
user = super().save_user(request, user, form, commit)
data = form.cleaned_data
user.reg_no = data.get('reg_no')
user.department = data.get('department')
user.university = data.get('university')
user.save()
return user
class CreateUser_Serializer(RegisterSerializer, serializers.ModelSerializer):
class Meta:
model = User
fields = ("username", "first_name", "last_name", 'email', 'nationality', 'bio', 'phone', 'phone2', 'gender',
'birthday', 'pin_code', 'password1', 'password2')
def custom_signup(self, request: Request, user: User) -> None:
for f in self.Meta.fields:
if hasattr(user, f) and not getattr(user, f):
setattr(user, f, self.initial_data[f])
user.save()
3条答案
按热度按时间sg24os4d1#
好的,你必须创建一个自定义用户。实际上,我不确定该怎么做,因为我正在使用dj_rest_auth包,它使用django的默认用户表来创建API响应。我离开这个解决方案,如果有人陷入这个。
创建应用程序。我给它起名叫账户。打开models.py并添加自定义用户,如下所示:
不要忘记编辑admin.py这个应用程序的www.example.com:
创建一个serializers.py并编辑以下内容:
您还必须添加adapter.py并添加以下代码:
最后,你必须将这些添加到你settings.py的项目的www.example.com:
将您的应用添加到已安装的应用:
添加rest auth序列化器:
添加适配器和CustomUser模型
this解决方案解决了这个问题。非常感谢Rik Schoonbeek。这里我还提供了显示API数据中返回的额外字段的代码。这个解决方案是为django_rest_auth编写的。那个包从一开始就使用自定义用户模型来进行API调用,但是dj_rest_auth包使用默认的django模型,这就是为什么我不确定该怎么做。
下面是一些图片来看看这个作品:
2uluyalo2#
我有一个更好的方法,更简单,更灵活。您可以使用django-allauth提供的**custom_signup()**函数专门针对这种情况。
输出:
enter image description here
plicqrtu3#
需要注意的是,您还需要创建CustomRegisterView(或另一个视图)并更改urlpatterns,如此答案Dj Rest Auth custom registration not working中所述。在那之后,一切都为我工作。