我正在使用 Django Rest Framework View 和序列化程序创建一个 html 注册表单。以前我使用 Django View 和表单创建了注册表单。在 Django 中,它的 Usercreation 表单已准备好可用,但不在 DRF 中。
我从 Django 源代码中找到了 Usercreationform 的以下代码:
class UsernameField(forms.CharField):
def to_python(self, value):
return unicodedata.normalize('NFKC', super().to_python(value))
class UserCreationForm(forms.ModelForm):
"""
A form that creates a user, with no privileges, from the given username and
password.
"""
error_messages = {
'password_mismatch': _("The two password fields didn't match."),
}
password1 = forms.CharField(
label=_("Password"),
strip=False,
widget=forms.PasswordInput,
help_text=password_validation.password_validators_help_text_html(),
)
password2 = forms.CharField(
label=_("Password confirmation"),
widget=forms.PasswordInput,
strip=False,
help_text=_("Enter the same password as before, for verification."),
)
class Meta:
model = User
fields = ("username",)
field_classes = {'username': UsernameField}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self._meta.model.USERNAME_FIELD in self.fields:
self.fields[self._meta.model.USERNAME_FIELD].widget.attrs.update({'autofocus': True})
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'],
code='password_mismatch',
)
return password2
def _post_clean(self):
super()._post_clean()
# Validate the password after self.instance is updated with form data
# by super().
password = self.cleaned_data.get('password2')
if password:
try:
password_validation.validate_password(password, self.instance)
except forms.ValidationError as error:
self.add_error('password2', error)
def save(self, commit=True):
user = super().save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
如何使用序列化程序创建此 UserCreationForm。 DRF 中是否有任何现成可用的东西。
最佳答案
为此使用此序列化程序:
class UserSerializer(ModelSerializer):
password1 = serializers.CharField(max_length=128, write_only=True)
password2 = serializers.CharField(max_length=128, write_only=True)
class Meta:
model = User
fields = (
'id',
'username',
'password',
'email',
'first_name',
'last_name',
'is_staff',
'is_superuser',
'password1',
'password2',
)
read_only_fields = ('id', 'is_staff', 'is_superuser')
def create(self, validated_data):
password1 = validated_data.pop('password1', '')
password2 = validated_data.pop('password2', '')
if password1 and password2 and password1 != password2:
raise ValidationError('password mismatch')
user = User.objects.create(**validated_data)
user.set_password(password1)
user.save()
return user
关于Django Form 转换为 Django Rest Framework Serializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50018688/