2017-06-08 7 views
1

ユーザー作成後にログインできません。ここに私のコードは次のとおりです。django - ユーザー作成後にログインできない

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) 

テストケースがcreate_userメソッドが第2引数としてemailとりユーザー

+0

シリアライザでデバッグしようとしました。 UserSerializerが入力データを検証した後、createメソッドでインスタンスを作成できます。しかし、何とかそのインスタンスは私のテストケースにログインすることはできません。 – achilles

答えて

1

を作成した後、ログイン声明で失敗したのです。あなたは、キーワード引数にpasswordを変更することで問題を解決できます。

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

電子メール、パスワード、およびその他のフィールドは単なるオプションのパラメータです。ユーザ名を提供するだけで、Userのインスタンスを作成できます。だから... – achilles

+0

私はあなたのコメントを理解していません。はい、あなただけのユーザー名でユーザーを作成することはできますが、ログインできなくなります。現在のコード 'User.objects.create_user(username、password、** validated_data)'は 'User.objects .create_user(username、email =パスワード、** validated_data) '。それを 'password = password'に変更する必要があります。 – Alasdair

+0

私はそれを得た。ありがとうございました:D – achilles

1

それを行う最も簡単な方法は、**ですべてを送信している:

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

それはあなたの問題を解決するだろう

+0

それは動作しませんでした。前に試しました – achilles

0

self.client.login()ですセッション認証を使用するAPIのテストに使用されます。セッション認証を使用していることを確認してください。

あなたの代わりにトークンベースの認証を使用している場合は、次のように実行する必要があります。

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

はそれがお役に立てば幸いです。

+0

メソッドcreate_userでは、パスワードがハッシュされます。したがって、そのステップでハッシュする必要はありません。 – achilles

+0

@ user3857032あなたは正しいです。ごめんなさい。私の更新された答えを見てください。 –

+0

問題は以前のような認証方法ではありません。 3番目のコメントとして、シリアライザのcreateメソッドのパラメータの面で間違いを犯しました。 btwありがとう – achilles

関連する問題