Django Form 转换为 Django Rest Framework Serializer

标签 django django-rest-framework

我正在使用 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/

相关文章:

python - django-rest-framework "AttributeError: ' 函数'对象没有属性 'get_extra_actions' ”

django - 使用已存储在数据库中的数据自动填充 ModelForm

javascript - 如何在 javascript 文件中输入 json 文件的正确路径

django - 获取 UpdateView django 中的所有字段

python - Django 在不同的模型字段上保存图像

python - DRF ModelMultipleChoiceFilter - 许多参数之一中的无效值导致空列表

datetime - 使用 Retrofit 将日期时间字段发送到 Django REST Framework 端点时出现问题

Django Rest Framework - 如何获取外键的外键字段

python - DRF : How to password protect the DefaultRouter

python - 需要从不同列表中选取单个元素并将它们存储在字典中