Django Rest 框架中的表单

Forms in Django Rest Framework

我可以轻松创建 ModelSeralizers,但我的表单有点小问题。有没有办法序列化下面的表格,或者如果我把它带到移动设备上,我需要用母语做每一个表格吗?

class SetPasswordForm(forms.Form):
    password1 = forms.CharField(label='New password',
                                widget=forms.PasswordInput(
                                    attrs={'placeholder': 'New password'}))
    password2 = forms.CharField(label='Verify new password',
                                widget=forms.PasswordInput(
                                    attrs={'placeholder': 'Password again'}))

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(SetPasswordForm, self).__init__(*args, **kwargs)

    def clean_password2(self):
        password_length = settings.MIN_PASSWORD_LENGTH
        password1 = self.cleaned_data.get("password1")
        if len(password1) < password_length:
            raise forms.ValidationError(
                "Password must be longer than "
                "{} characters".format(password_length))
        password2 = self.cleaned_data.get("password2")
        if password1 and password2:
            if password1 != password2:
                raise forms.ValidationError("Passwords do not match")
        return password2

您可以创建一个名为 PasswordSerializer 的序列化程序,它执行与上面在 SetPasswordForm 中所做的相同的检查和验证。

我们创建了一个具有 2 个字段 password1password2 的序列化程序。

password1 字段有 min_length 参数传递给它,它验证输入包含的字符不少于此数量。此外,我们为 error_messages 字典中的输入小于 min_length 的情况定义了自定义错误消息。这样做会删除您之前在表单中执行的验证,现在 DRF 将为您处理。此外,序列化程序字段 allow_null 设置为 False。因此,如果发送 None 值,DRF 会自动处理。

我们需要创建一个 validate() 函数来检查密码是否匹配。如果 2 个密码不匹配,序列化程序将引发 ValidationError.

转换为 DRF 序列化程序的上述代码将类似于:

from rest_framework import serializers

class PasswordSerializer(serializers.Serializer):

    password1 = serializers.CharField(min_length=settings.MIN_PASSWORD_LENGTH, error_messages={'min_length': "Password must be longer than {} characters".format(settings.MIN_PASSWORD_LENGTH)})
    password2 = serializers.CharField()

    def validate(self, data):
        if data['password1'] != data['password2']: # Check if the 2 passwords match
            raise serializers.ValidationError("Passwords do not match")
        return data