Django Rest Framework-检查密码以验证表单

时间:2018-11-11 02:42:04

标签: django django-rest-framework

我正在尝试通过DRF验证表单,但这需要用户输入密码进行确认。我似乎无法正常工作。这是我当前的视图和序列化器。对于“更改电子邮件”表格,必须填写两个字段,即电子邮件和用户密码。这是一个单独的电子邮件模型。序列化器:

class UpdateEmailAddressSerializer(serializers.ModelSerializer):

    class Meta:
        model = EmailAddress
        fields = ('email',)

和APIView:

class UpdateEmailAPI(APIView):

permission_classes = (IsAuthenticated,)
serializer_class = UpdateEmailAddressSerializer

def post(self, request, user, format=None):
    user = User.objects.get(username=user)
    serializer = UpdateEmailAddressSerializer(data=request.data, instance=user)
    if serializer.is_valid():

        ## logic to check and send email

        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

    else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)  

我不确定将密码放置在何处或如何处理。它来自用户模型本身。当我尝试向UpdateEmail序列化程序中的字段添加密码时,它最终用纯文本更新了用户密码,并使该用户对象无法使用该密码。

我只想检查用户密码以确认此表格。有明显的方法吗?

编辑

当我尝试将'password'引入序列化程序时,出现错误,提示“字段名称password对于模型EmailAddress无效。”因此,当我尝试将其引入时

password = serializers.CharField(required=True)

或尝试:

## UserPasswordSerializer 
class UserPasswordSerializer(serializers.ModelSerializer):

class Meta:
    model = User
    fields = (
        'password',
        )

## In UpdateEmailAddressSerializer
password = UserPasswordSerializer()

在DRF上提交表单时出现此错误:

  

尝试获取字段值时出现AttributeError       password在串行器UpdateEmailAddressSerializer上。的       序列化程序字段的名称可能不正确,不匹配       EmailAddress实例上的属性或键。原始例外       文字为:“ EmailAddress”对象没有属性“ password”

因此,似乎是在告诉我密码不是EmailAddress模型的一部分,这是正确的。但是我无法弄清楚如何简单地在表单发布旁检查密码而不将其设置为EmailAddress的一部分。

1 个答案:

答案 0 :(得分:1)

我认为您可以尝试这样:

class UpdateEmailAddressSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)
    class Meta:
        model = EmailAddress
        fields = ('email', 'password',)

    def create(self, validated_data):
       validated_data.pop('password', None)
       return super(UpdateEmailAddressSerializer, self).create(validated_data)

    def update(self, instance, validated_data):
         if instance.check_password(validated_data.get('password')):
               instance.email = validated_data.get('email', instance.email)
         # else throw validation error
         return instance