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 个字段 password1
和 password2
的序列化程序。
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
我可以轻松创建 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 个字段 password1
和 password2
的序列化程序。
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