我正在尝试使用密码哈希实现用户注册。
问题是密码是原始保存的(因为它是键入的)。
出于某种原因,我认为序列化器中的 create方法不会被称为。
如果我将方法注释掉或不注释,并尝试注册,同样的结果 - 无关紧要 - 将用户保存到数据库而不哈希密码 - 这意味着代码没有'执行??
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
我一直在努力解决这个问题 - 无法拥有密码。
有什么想法吗?
答案 0 :(得分:0)
不是在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()
答案 1 :(得分:0)
create函数在目标类中,它必须在主类中,删除缩进选项卡
UserSerializer类(serializers.ModelSerializer):
lazy