2015-08-02 3 views
0

Я могу легко создавать ModelSeralizers, но у меня небольшие проблемы с моими Формами. Есть ли способ сериализации формы ниже или мне нужно делать каждую форму на родном языке, если я беру это на мобильное устройство?Формы в Django Rest Framework

Спасибо заранее!

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 

ответ

0

Вы можете создать сериалайзер с именем PasswordSerializer, который выполняет ту же проверку и подтверждение, как вы делаете выше в SetPasswordForm.

Мы создаем сериализатор, имеющий 2 поля password1 и password2.

password1 Поле содержит min_length аргумент, который подтверждает, что вход содержит не меньше, чем это число символов. Кроме того, мы определяем настраиваемое сообщение об ошибке для случая, в котором ввод меньше min_length в словаре error_messages. При этом удаляются проверки, которые вы выполняли ранее в вашей форме, и теперь DRF будет обрабатывать это для вас. Кроме того, поля сериализатора имеют allow_null, установленный в False. Итак, если значение None отправлено, DRF автоматически обрабатывает это.

Нам нужно создать функцию validate(), которая проверяет соответствие паролей или нет. Если 2 пароли не совпадают, сериализатор поднимет ValidationError.

Приведенный выше код преобразуется в ФПИ сериализатором будет что-то вроде:

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 
+0

Благодарим Вас за это! Чтобы уточнить, я, по сути, должен заново создать каждую форму в качестве сериализатора? Очевидно, я могу скопировать и вставить много валидаторов, но нет способа ссылаться на форму там? – jape

+0

Да, вам нужно будет воссоздать каждую форму как сериализатор. Сериализаторы работают очень похоже на формы Django. Вы можете добавить валидации формы в сериализаторы, и они будут работать аналогично формам. И нет, вы используете либо форму, либо сериализатор для достижения того, что вы делали раньше. Вы не можете ссылаться на форму в своем сериализаторе, а это необязательно. –

Смежные вопросы