Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “确认密码”是此函数的无效关键字参数_Python_Django_Django Rest Framework - Fatal编程技术网

Python “确认密码”是此函数的无效关键字参数

Python “确认密码”是此函数的无效关键字参数,python,django,django-rest-framework,Python,Django,Django Rest Framework,我使用DRF并在django上注册我的博客。我在下一行收到views.py中的密码错误 User.objects.create_user(**serializer.validated_data) 我不知道怎么了 这是我正在使用的视图 class UserViewSet(ModelViewSet): lookup_field = 'username' queryset = User.objects.all() serializer_class = UserSeri

我使用DRF并在django上注册我的博客。我在下一行收到views.py中的密码错误

User.objects.create_user(**serializer.validated_data)
我不知道怎么了

这是我正在使用的视图

class UserViewSet(ModelViewSet):    
    lookup_field = 'username'
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get_permissions(self):
        if self.request.method in permissions.SAFE_METHODS:
            return (permissions.AllowAny(), )
        if self.request.method == 'POST':
            return (permissions.AllowAny(), )
        return (permissions.IsAuthenticated(), IsOwner(), )

    def create(self, request):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            User.objects.create_user(**serializer.validated_data)
            return Response(serializer.validated_data, status=status.HTTP_201_created)
        return Response({'status': 'Bad request', 'message': 'Account could not be created with received data'},
                        status=status.HTTP_400_BAD_REQUEST)
下面是它附带的序列化程序

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=False)
    confirm_password = serializers.CharField(write_only=True, required=False)

    class Meta:
        model = User
        fields = ('id', 'email', 'username', 'first_name', 'last_name', 'password', 'confirm_password',)

        def create(self, validation_data):
            return User.objects.create(**validation_data)

这里发生的一些事情似乎有点。。。奇怪

您正在覆盖视图上的create,唯一的区别似乎是覆盖错误格式的方式。也许这是最好的选择

您正在重写序列化程序上的create,但实际上从未使用过它。这是因为您从未在视图中调用serializer.save或serializer.create,这是创建新对象的推荐方法

您正在接受密码确认,但实际上并没有对其进行任何操作。它只是坐在那里搭便车,甚至不是必填字段

现在,前两点你必须自己处理。老实说,我建议您放弃自定义的create方法,只重写异常处理程序上的错误格式,但无论如何,这不是您当前的问题所在


您当前的问题是因为3,您正在将确认的密码传递到create_user方法中,这是不需要的。要么你应该放弃密码确认,要么你的API不应该处理它,要么你需要在验证后弹出该字段,这样它就不会被传递到你正在使用的任何创建方法中。

这里有一些事情看起来有点。。。奇怪

您正在覆盖视图上的create,唯一的区别似乎是覆盖错误格式的方式。也许这是最好的选择

您正在重写序列化程序上的create,但实际上从未使用过它。这是因为您从未在视图中调用serializer.save或serializer.create,这是创建新对象的推荐方法

您正在接受密码确认,但实际上并没有对其进行任何操作。它只是坐在那里搭便车,甚至不是必填字段

现在,前两点你必须自己处理。老实说,我建议您放弃自定义的create方法,只重写异常处理程序上的错误格式,但无论如何,这不是您当前的问题所在


您当前的问题是因为3,您正在将确认的密码传递到create_user方法中,这是不需要的。要么你应该放弃密码确认,要么你的API不应该处理它,要么你需要在验证后弹出该字段,这样它就不会被传递到你正在使用的任何创建方法中。

查看上面的代码,我很确定问题是由于你的用户模型中没有确认密码字段,因为Django的内置用户模型中没有confirm_password字段。因此,如果您使用的是django User,请从序列化程序中删除confirm_密码,这样就可以了

但是如果您想使用您正在使用的方式,您需要使用AbstractBaseUser来创建一个定制的Django用户,并且需要像这样修改models.py

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models


class AccountManager(BaseUserManager):
    def create_user(self, email, password=None, **kwargs):
        if not email:
            raise ValueError('Users must have a valid email address.')

        if not kwargs.get('username'):
            raise ValueError('Users must have a valid username.')

        account = self.model(
            email=self.normalize_email(email), username=kwargs.get('username')
        )

        account.set_password(password)
        account.save()

        return account

    def create_superuser(self, email, password, **kwargs):
        account = self.create_user(email, password, **kwargs)

        account.is_admin = True
        account.save()

        return account


class Account(AbstractBaseUser):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=40, unique=True)

    first_name = models.CharField(max_length=40, blank=True)
    last_name = models.CharField(max_length=40, blank=True)
    tagline = models.CharField(max_length=140, blank=True)

    is_admin = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = AccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def __unicode__(self):
        return self.email

    def get_full_name(self):
        return ' '.join([self.first_name, self.last_name])

    def get_short_name(self):
        return self.first_name
此外,还需要更改settings.py文件,请在底部指定

AUTH_USER_MODEL = 'authentication.Account'

查看上面的代码,我很确定问题是由于您的用户模型中没有confirm_password字段,因为Django的内置用户模型中没有confirm_password字段。因此,如果您使用的是django User,请从序列化程序中删除confirm_密码,这样就可以了

但是如果您想使用您正在使用的方式,您需要使用AbstractBaseUser来创建一个定制的Django用户,并且需要像这样修改models.py

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models


class AccountManager(BaseUserManager):
    def create_user(self, email, password=None, **kwargs):
        if not email:
            raise ValueError('Users must have a valid email address.')

        if not kwargs.get('username'):
            raise ValueError('Users must have a valid username.')

        account = self.model(
            email=self.normalize_email(email), username=kwargs.get('username')
        )

        account.set_password(password)
        account.save()

        return account

    def create_superuser(self, email, password, **kwargs):
        account = self.create_user(email, password, **kwargs)

        account.is_admin = True
        account.save()

        return account


class Account(AbstractBaseUser):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=40, unique=True)

    first_name = models.CharField(max_length=40, blank=True)
    last_name = models.CharField(max_length=40, blank=True)
    tagline = models.CharField(max_length=140, blank=True)

    is_admin = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = AccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def __unicode__(self):
        return self.email

    def get_full_name(self):
        return ' '.join([self.first_name, self.last_name])

    def get_short_name(self):
        return self.first_name
此外,还需要更改settings.py文件,请在底部指定

AUTH_USER_MODEL = 'authentication.Account'

谢谢!这是帮助我=非常感谢!这是帮我的=