San*_*idi 6 django django-rest-framework
我正在使用Django Rest Framework视图和序列化器创建一个html注册表单.以前我使用Django视图和表单创建了注册表单.在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
Run Code Online (Sandbox Code Playgroud)
如何使用序列化程序创建此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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |