Как я могу заменить формы моим сериализатором в django - PullRequest
0 голосов
/ 19 апреля 2020

Model.py

class UserProfileInfo(models.Model):

    user = models.OneToOneField(User,on_delete=models.CASCADE,default='')
    # user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone_no = models.CharField(max_length=13,unique=True)
    registered = models.BooleanField(default=False)
    spam = models.BooleanField(default=False)

    def __str__(self):
        return self.user.username

Serializer.py

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField()

    class Meta():
        model = User
        fields = ('username','email','password')

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta():
        model = UserProfileInfo
        fields = ('phone_no',)

views.py

def register(request):
    registered = False
    if request.method == 'POST':
        user_serializer = UserSerializer(data=request.POST)
        profile_serializer = UserProfileSerializer(data=request.POST)
        if user_serializer.is_valid() and profile_serializer.is_valid():
            user = user_serializer.save()
            user.set_password(user.password) #saving hash value of password
            user.save()

            profile = profile_serializer.save(commit=False)
            profile.user = user
            profile.registered = True
            profile.save()
            registered = True
        else:
            print(user_serializer.errors)
    else:
        user_serializer = UserSerializer
        profile_serializer = UserProfileSerializer

    return Response(request,'basic_app/registration.html',{
            'user_serializer':user_serializer,
            'profile_form':profile_form,
            'registered':registered
    })

def user_login(request):

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username,password)

        user = authenticate(username=username, password=password)
        print(user)

        if user:
            if user.is_active:
                login(request,user)
                return render(request,'basic_app/search.html')
            else:
                return HttpResponse('Account not active!')
        else:
            # print(username,password)
            return HttpResponse('Login credentials not correct!')
    else:
        return render(request,'basic_app/login.html')

Теперь мне нужно внести изменения в мои views.py так, чтобы я мог параллельно заполнять пользователя и модель профиля, имея одно к одному полю. Я использовал форму, которая работала хорошо, но теперь мне нужно преобразовать код в API остальных. Пожалуйста, помогите, как я могу сохранить ту же функциональность, используя приведенный выше класс сериализатора. Моя цель - зарегистрироваться и войти в систему пользователя.

1 Ответ

0 голосов
/ 19 апреля 2020

Во-первых, метод c в сериализаторе похож на мой простой код: (я писал этот класс в своем REST-проекте для студента-регистратора)

class StudentRegistrationSerializer(serializers.ModelSerializer):
    password = serializers.CharField(style={'input_type': 'password'}, required=True)
    password2 = serializers.CharField(style={'input_type': 'password'}, required=True)

    class Meta:
        model = Student
        fields = ['phone_number', 'password', 'password2', 'name', 'family']
        extra_kwargs = {
            'password': {'write_only': True}
        }

    def save(self, **kwargs):
        phone_number = self.validated_data.get('phone_number')
        name = self.validated_data.get('name')
        family = self.validated_data.get('family')
        password = self.validated_data.get('password')
        password2 = self.validated_data.get('password2')
        not_active = User.objects.filter(username=phone_number, is_active=False)
        is_active = User.objects.filter(username=phone_number, is_active=True)
        if password != password2:
            raise serializers.ValidationError({'error': 'password not matched'})
        if is_active:
            raise serializers.ValidationError({'error': 'username already exist'})
        if not_active:
            raise serializers.ValidationError({'error': 'username already exist active your account'})
        user = User(username=phone_number, password=password, is_active=False)
        user.set_password(password)
        user.save()
        student = Student(phone_number=phone_number, user=user, name=name, family=family)
        student.save()
        return student

и возвращал сохраненный объект здесь student

и я рекомендую вам использовать встроенный LoginView в сторонней библиотеке, такой как "rest_auth", эта библиотека обрабатывает токен

после установки "rest_auth" с помощью:

pip install django-rest-auth

в файле url просто импортируйте:

from rest_auth.views import LoginView

и используйте его без каких-либо сложностей

...