Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
django-Can';t在创建用户后登录_Django_Django Rest Framework - Fatal编程技术网

django-Can';t在创建用户后登录

django-Can';t在创建用户后登录,django,django-rest-framework,Django,Django Rest Framework,创建用户后我无法登录。这是我的密码: class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = '__all__' def create(self, validated_data): username = validated_data.pop('username') password = validate

创建用户后我无法登录。这是我的密码:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

    def create(self, validated_data):
        username = validated_data.pop('username')
        password = validated_data.pop('password')
        return User.objects.create_user(username, password, **validated_data)
我的api:

from django.contrib.auth.models import User
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
感谢您的帮助。 更新:这是我的测试用例

class UserAPITestCase(APITestCase):

def setUp(self):
    self.client = APIClient()

    self.user = User.objects.create_user(
        username='anhnguyen',
        password=PASSWORD,
    )
    self.user.save()

def test_create_user(self):
    data = {
        'username': 'khoavo',
        'password': PASSWORD,
    }

    user = self.client.post(URL, data, format='json')
    self.assertEqual(user.status_code, status.HTTP_201_CREATED)

    url = reverse(URL1, args=[2])
    response = self.client.get(url)
    self.assertEqual(response.status_code, status.HTTP_200_OK)

    login = self.client.login(username='khoavo', password=PASSWORD)
    self.assertTrue(login)
在创建用户后,测试用例在login语句中失败。该方法将
email
作为第二个参数。您可以通过将
password
更改为关键字参数来解决此问题:

return User.objects.create_user(username, password=password, **validated_data)

最简单的方法是使用
**
发送所有信息:

...
def create(self, validated_data):
    return User.objects.create_user(**validated_data)
...
它将解决您的问题

self.client.login()用于测试使用会话身份验证的API。确保您正在使用会话身份验证

如果改为使用基于令牌的身份验证,则应执行以下操作:

client = APIClient()
client.credentials(HTTP_AUTHORIZATION='Token ' + token)

希望有帮助。

在创建用户的方法中,密码将被散列。所以我们不需要在这一步进行哈希运算。@user3857032您是对的。很抱歉请看我的最新答案。问题不在于什么样的身份验证,因为我以前就这样做过。作为第三条注释,我在序列化程序中create方法的参数方面犯了一个错误。顺便说一句,谢谢电子邮件、密码和其他字段只是可选参数。只需提供用户名,即可创建用户实例。所以…我不理解你的评论。是的,您可以只使用用户名创建一个用户,但是您将无法登录。您当前的代码
User.objects.create\u User(用户名、密码,**验证的\u数据)
相当于
User.objects.create\u User(用户名、电子邮件=密码,**验证的\u数据)
。这就是为什么你应该把它改成
password=password
。我知道了。谢谢:DI试图在序列化程序中调试。UserSerializer验证输入数据后,可以通过create方法创建实例。但不知何故,那个实例无法登录到我的测试用例中。我已经测试过了,这应该可以工作了。如果
validated\u data
是一个字典,那么它应该将kwargs传递给
create\u user()
。如果它不起作用,问题应该在别处。