我正在尝试通过密码哈希实现用户注册。
问题密码是原始保存的(按输入)。
出于某种原因,我认为未在序列化程序中创建方法。
无论我注释掉该方法还是不注释掉它都没关系,并尝试注册,结果相同-将用户保存到数据库而不散列密码-意味着代码不执行? ?
Views.py
class UserViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.ListModelMixin,
viewsets.GenericViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (IsCreationOrIsAuthenticated,)
Serizliers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'password', )
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(
first_name=validated_data['first_name'],
username=validated_data['username'],
last_name=validated_data['last_name']
)
user.set_password(validated_data['password'])
user.save()
return user
我已经为此苦苦挣扎了一段时间-无法获得密码。
有什么想法吗?
create函数在目标类中,它必须在主类中,删除缩进选项卡
类UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'password', )
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(
first_name=validated_data['first_name'],
username=validated_data['username'],
last_name=validated_data['last_name']
)
user.set_password(validated_data['password'])
user.save()
return user
[而不是在create
中编写serializers.py
方法,而是通过覆盖perform_create()
中的views.py
方法来完成此工作。为了在创建对象方面做一些额外的工作,DRF提供了此挂钩。这将使代码更加干净和干燥。
根据DRF文档,
保存和删除挂钩:
mixin类提供以下方法,并提供轻松覆盖对象的保存或删除行为。
perform_create(self,serializer)-由CreateModelMixin调用,当保存一个新的对象实例。perform_update(self,serializer)-保存现有对象实例时,由UpdateModelMixin调用。perform_destroy(self,instance)-由DestroyModelMixin调用,当删除对象实例。这些挂钩对于设置在请求中隐含但不属于请求的属性请求数据。
您可以通过以下方式进行此操作:
views.py
def perform_create(self, serializer):
user = User(
first_name=serializer.data['first_name'],
username=serializer.data['username'],
last_name=serializer.data['last_name']
)
user.set_password(serializer.data['password'])
user.save()