如何在序列化程序中提及密码字段?
how to mention password field in serializer?
我有一个 自定义用户 用于身份验证,我想为它创建一个序列化程序 class 我的自定义用户的模型是这样的 :
class User (AbstractUser):
bio = models.TextField(max_length=500, blank=True)
birth_date = models.DateField(null=True, blank=True)
image=models.FileField(null=True , blank=True)
我的序列化程序是:
class UserSerializer (serializers.ModelSerializer):
class Meta:
model = User
fields = ('username' ,'email' ,'password' ,'firstname' , 'last name' )
我怎么能提到 密码字段 是密码并且其内容必须经过哈希处理?
DRF 中没有专门的密码字段。在我当前的项目中,我们过去常常将密码字段定义为 CharField
,在序列化器 class.
中使用 write_only=True
改变serializers.py
如下
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
class Meta:
model = User
fields = ('username', 'email', 'password', 'firstname', 'last name')
def create(self, validated_data):
user = super().create(validated_data)
user.set_password(validated_data['password'])
user.save()
return user
def update(self, instance, validated_data):
user = super().update(instance, validated_data)
try:
user.set_password(validated_data['password'])
user.save()
except KeyError:
pass
return user
要散列密码,请调用:
make_password(origin_password)
示例serializers.py:
from rest_framework import serializers
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password
class UserSerializer(serializers.HyperlinkedModelSerializer):
password = serializers.CharField(
write_only=True,
required=True,
help_text='Leave empty if no change needed',
style={'input_type': 'password', 'placeholder': 'Password'}
)
class Meta:
model = User
fields = ('url', 'username', 'email', 'password')
def create(self, validated_data):
validated_data['password'] = make_password(validated_data.get('password'))
return super(UserSerializer, self).create(validated_data)
@MahdiSorkhmiri 的回答非常适合我。这是我的文件现在写的样子。
class UserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
validators=[UniqueValidator(UserModel.objects.all())]
)
password = serializers.CharField(
min_length=4,
write_only=True,
required=True,
style={'input_type': 'password'}
)
def create(self, validated_data):
fields = ['username', 'password', 'email']
data = {f: validated_data.get(f) for f in fields}
return UserModel.objects.create_user(**data)
class Meta:
model = UserModel
fields = 'username email last_name first_name password'.split()
我有一个 自定义用户 用于身份验证,我想为它创建一个序列化程序 class 我的自定义用户的模型是这样的 :
class User (AbstractUser):
bio = models.TextField(max_length=500, blank=True)
birth_date = models.DateField(null=True, blank=True)
image=models.FileField(null=True , blank=True)
我的序列化程序是:
class UserSerializer (serializers.ModelSerializer):
class Meta:
model = User
fields = ('username' ,'email' ,'password' ,'firstname' , 'last name' )
我怎么能提到 密码字段 是密码并且其内容必须经过哈希处理?
DRF 中没有专门的密码字段。在我当前的项目中,我们过去常常将密码字段定义为 CharField
,在序列化器 class.
write_only=True
改变serializers.py
如下
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
class Meta:
model = User
fields = ('username', 'email', 'password', 'firstname', 'last name')
def create(self, validated_data):
user = super().create(validated_data)
user.set_password(validated_data['password'])
user.save()
return user
def update(self, instance, validated_data):
user = super().update(instance, validated_data)
try:
user.set_password(validated_data['password'])
user.save()
except KeyError:
pass
return user
要散列密码,请调用:
make_password(origin_password)
示例serializers.py:
from rest_framework import serializers
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password
class UserSerializer(serializers.HyperlinkedModelSerializer):
password = serializers.CharField(
write_only=True,
required=True,
help_text='Leave empty if no change needed',
style={'input_type': 'password', 'placeholder': 'Password'}
)
class Meta:
model = User
fields = ('url', 'username', 'email', 'password')
def create(self, validated_data):
validated_data['password'] = make_password(validated_data.get('password'))
return super(UserSerializer, self).create(validated_data)
@MahdiSorkhmiri 的回答非常适合我。这是我的文件现在写的样子。
class UserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
validators=[UniqueValidator(UserModel.objects.all())]
)
password = serializers.CharField(
min_length=4,
write_only=True,
required=True,
style={'input_type': 'password'}
)
def create(self, validated_data):
fields = ['username', 'password', 'email']
data = {f: validated_data.get(f) for f in fields}
return UserModel.objects.create_user(**data)
class Meta:
model = UserModel
fields = 'username email last_name first_name password'.split()