【问题标题】:Forms in Django Rest FrameworkDjango Rest 框架中的表单
【发布时间】:2015-10-24 18:24:28
【问题描述】:

我能够轻松创建 ModelSeralizer,但我的表单遇到了一些问题。有没有办法序列化下面的表单,或者如果我把它带到移动设备上,我需要用母语做每个表单吗?

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

【问题讨论】:

    标签: django django-rest-framework django-forms


    【解决方案1】:

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

    我们创建了一个序列化器,它有两个字段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
    

    【讨论】:

    • 谢谢你!为了澄清,我基本上必须将每个表单重新创建为序列化程序?很明显我可以复制和粘贴很多验证器,但是没有办法引用表单吗?
    • 是的,您必须将每个表单重新创建为序列化程序。序列化程序的工作方式与 Django 表单非常相似。您可以在序列化程序中添加表单验证,它们的工作方式与表单类似。不,您使用表单或序列化程序来实现您之前所做的事情。您不能在序列化程序中引用表单,这是不必要的。
    猜你喜欢
    • 2015-07-14
    • 2015-08-07
    • 1970-01-01
    • 2018-05-09
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多