1

すべてのユーザー名、パスワード、および電子メールフィールドが提供されている場合、django-rest-auth にユーザーを登録したいと考えています。(トークン認証も実装して、サーバーから JSON 応答を取得したいと考えています。)

のデフォルトの電子メール フィールドdjango.contrib.auth.Userはオプションです。しかし、データベースに登録するために必要な電子メールを設定して、電子メールなしで POST 要求が行われたときにユーザーが HTTP エラー応答を受け取るようにしたいと考えています。

プロジェクトでは、次のコードを使用して新しいユーザーを登録しています。

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', User.USERNAME_FIELD, "password", 'full_name',
                  'is_active', 'links', )
        write_only_fields = ('password',)
        read_only_fields = ('id',)

    def create(self, validated_data):
        print("Validated Data",validated_data)
        if 'email' in validated_data:
            user = get_user_model().objects.create(
                username=validated_data['username']
            )
            user.set_email(validated_data['email'])
            user.set_password(validated_data['password'])
            user.save()
            email = EmailMessage('Hello', 'World',
                                 to=[validated_data['email']])
            email.send()
            user.is_active=False
            return user
        else:
            return None

ただし、上記の結果は次のとおりです。

create() はオブジェクト インスタンスを返しませんでした

電子メール フィールドを必須フィールドとして設定するにはどうすればよいですか?

4

1 に答える 1

0

すべてのユーザー名、パスワード、および電子メールフィールドが提供されている場合、django-rest-auth にユーザーを登録したいと考えています。

Django REST フレームワークのシリアライザーでフィールドを要求する正しい方法は、フィールドを初期化するときに設定するrequired=Trueパラメーターを使用しextra_kwargsて自動生成されたフィールドに設定することです。

django.contrib.auth.User のデフォルトの email フィールドはオプションです。しかし、データベースに登録するために必要に応じて電子メールを設定して、電子メールなしで POST 要求が行われたときにユーザーが HTTP エラー応答を受け取るようにしたいと考えています。

つまり、自動生成されたフィールドはデフォルトでは必須ではありませんが、 でオーバーライドできますrequired=True

ただし、上記の結果は次のとおりです。

create() はオブジェクト インスタンスを返しませんでした

これは、ティンに書かれているようにUser、メソッドからインスタンスを返さないためです。create具体的には、フィールドが含まれていないNone場合に返されます。はインスタンスではなく、DRF は何か間違ったことをしていると警告しています。emailNoneUser

于 2015-05-23T21:29:02.607 に答える