2017-05-13 7 views
0

method 1すべてが正常に動作しますが、それはDjangoのRESTフレームワークのユーザー登録バリデーション混乱

にこの問題を与えると私はtwo different methods

でDjangoのREST APIを使用してユーザーを登録しようとしています:

https://stackoverflow.com/questions/43952178/django-rest-framework-user-registration-confusion

method 2とすると、次のエラーが発生しますバックエンドでユーザーを作成しています

はAttributeErrorで/ API /ユーザー/ は、シリアライザ UserCreateSerializer上のフィールドpassword2の値を取得しようとしたときに/

ガットはAttributeErrorを登録します。シリアライザフィールドの名前が であり、Userインスタンスの属性またはキーと一致しない可能性があります。 元の例外テキストは 'User'オブジェクトには属性がありません 'password2'です。

コード:

from django.contrib.auth import get_user_model 
from rest_framework.exceptions import ValidationError 

from rest_framework.serializers import (ModelSerializer,CharField) 

User = get_user_model() 


class UserCreateSerializer(ModelSerializer): 
    password2 = CharField(label='Confirm Password') 
    class Meta: 
     model = User 
     fields = [ 
      'username', 
      'password', 
      'password2', 
      'email', 
     ] 
     extra_kwargs = { 
      'password' : {'write_only': True}, 
      'password2': {'write_only': True}, 
     } 

    def validate_password(self, value): 
     data = self.get_initial() 
     password = data.get('password2') 
     password2 = value 
     if password != password2: 
      raise ValidationError('Passwords must match') 
     return value 

    def validate_password2(self, value): 
     data = self.get_initial() 
     password = data.get('password') 
     password2 = value 
     if password != password2: 
      raise ValidationError('Passwords must match') 
     return value 

方法1:

def create(self, validated_data): 
    username = validated_data['username'] 
    email = validated_data['email'] 
    password = validated_data['password'] 
    user_obj = User(
     username=username, 
     email=email 
    ) 
    user_obj.set_password(password) 
    user_obj.save() 
    return validated_data 

方法2:

def create(self, validated_data): 
     user = User(
      email=validated_data['email'], 
      username=validated_data['username'], 
     ) 
     user.set_password(validated_data['password']) 
     user.save() 
     return user 

注:のpython3を使用して、Djangoの10.7 & DjangoのRESTフレームワーク3

+0

[Django REST Frameworkユーザー登録の混乱]の可能な複製(http:// stackoverflow。com/questions/43952178/django-rest-framework-user-registration-confusion) – e4c5

答えて

0

あなたの方法での問題は、Userモデルの属性ではありませんパスワード2を、渡しているということです。

あなたのコードを読んでから、私はあなたが代わりに繰り返しますが、そのためにオブジェクト幅広い検証を行うことができ、各パスワードフィールドを検証するこの、

ような何かを試みることができると思います。

def validate(self, data): 
    password = data.get('password') 
    confirm_password = data.pop('password2') 
    if password != confirm_password: 
     raise ValidationError('.............') 
    return data 

あなたが書かれているの作成方法は十分であろう、私は

EDIT

編集.. はこれを試してみて、何が起動した場合、私に知らせて願っていますあなたの方法、

を作成
def create (self, validated_data): 
    email = validated_data.get('email') 
    username = validated_data.get('username') 
    password = validated_data.get('password') 
    try: 
     user = User.objects.create(username=username, email=email) 
     user.set_password(password) 
     user.save() 
     return user 
    except Exception as e: 
     return e 

電子メール、パスワード、ユーザー名のいずれかが利用できない場合、KeyErrorが発生する可能性があります。

+0

あなたのコードを試しましたが、それは 'KeyError'を与えます。 'User'モデルの属性として' password2'を追加する方法を提案してください。 –

+0

スタックトレース全体を投稿できますか? – zaidfazil

+0

Password2はユーザモデルのフィールドではないため、シリアル化する際には、検証後または作成メソッドに達する前にpassword2を削除する必要があります。 Else djangoは属性エラーを発生させます。 – zaidfazil

関連する問題