Как я могу вызвать собственный метод в django представлении API на основе класса - PullRequest
0 голосов
/ 14 января 2020

Я хочу создать учетную запись, используя номер телефона в качестве имени пользователя, и сгенерировать otp код. Теперь я хочу подтвердить свой номер телефона. Я создаю метод is_phone_valid для проверки своего номера телефона, но звоню по почте, но получаю сообщение об ошибке error image Это мои views.py

class GetPhoneNumber(CreateAPIView):
    queryset = TempRegistration.objects.all()
    serializer_class = AccountsSerializer

    def is_phone_valid(phone_number):
        if phone_number:
            MOBILE_REGEX = re.compile('^(?:\+?88)?01[15-9]\d{8}$')
            if MOBILE_REGEX.match(phone_number):
                return True
            else:
                return False
        else:
            return False

    def post(self, request, *args, **kwargs):
        return self.is_phone_valid(phone_number)

models.py

class TempRegistration(models.Model):
    phone_number = models.CharField(max_length=45)
    otp_code = models.CharField(max_length=6)

    def __str__(self):
        return self.phone_number

Ответы [ 4 ]

1 голос
/ 14 января 2020

Похоже, вы используете Django REST Framework . Если это так, используйте на уровне поля - DRF do c проверка Сериализаторы DRF , как показано ниже

# views.py
class GetPhoneNumber(CreateAPIView):
    queryset = TempRegistration.objects.all()
    serializer_class = AccountsSerializer


# serializers.py
class AccountsSerializer(serializers.ModelSerializer):
    def validate_phone_number(self, phone_number):
        MOBILE_REGEX = re.compile('^(?:\+?88)?01[15-9]\d{8}$')
        if MOBILE_REGEX.match(phone_number):
            return phone_number
        else:
            raise serializers.ValidationError('No. not matching')

    class Meta:
        model = TempRegistration
        fields = '__all__'

Примечание: Вам не нужно переопределять метод post(...) класса CreateAPIView.

0 голосов
/ 14 января 2020

Отправленная вами обратная трассировка объясняет, что она не может найти phone_number, который вы передаете self.is_phone_valid(phone_number) в вашем методе записи.

Во-вторых, ваш вопрос заключается в том, как вызвать is_phone_valid из внутри класса? Вам нужно сделать pass self в качестве первого аргумента этого метода.

class GetPhoneNumber(CreateAPIView):
    queryset = TempRegistration.objects.all()
    serializer_class = AccountsSerializer

    def is_phone_valid(self, phone_number):
        if phone_number:
            MOBILE_REGEX = re.compile('^(?:\+?88)?01[15-9]\d{8}$')
            if MOBILE_REGEX.match(phone_number):
                return True
            else:
                return False
        else:
            return False

    def post(self, request, *args, **kwargs):
        phone_number = request.data['phone_number']
        return self.is_phone_valid(phone_number)
0 голосов
/ 14 января 2020

Вы должны определить переменную phone_number. Я надеюсь, что вы используете DRF, тогда параметр phone_number будет доступен в request.data

class GetPhoneNumber(CreateAPIView):
    queryset = TempRegistration.objects.all()
    serializer_class = AccountsSerializer

    def is_phone_valid(phone_number):
        if phone_number:
            MOBILE_REGEX = re.compile('^(?:\+?88)?01[15-9]\d{8}$')
            if MOBILE_REGEX.match(phone_number):
                return True
            else:
                return False
        else:
            return False

    def post(self, request, *args, **kwargs):
        phone_number = request.data['phone_number']
        return Response({'result' : self.is_phone_valid(phone_number)})
0 голосов
/ 14 января 2020

Если вы хотите извлечь номер телефона в параметрах POST [wiki] , то вы должны получить к нему доступ в self.request.POST.

Более того, вы не можете вернуть логическое значение как результат запроса. Это должен быть HttpResponse, например JsonResponse объект [Django -doc] :

from django.http import JsonResponse

class GetPhoneNumber(CreateAPIView):
    queryset = TempRegistration.objects.all()
    serializer_class = AccountsSerializer

    def is_phone_valid(self, phone_number):
        if phone_number:
            MOBILE_REGEX = re.compile('^(?:\+?88)?01[15-9]\d{8}$')
            if MOBILE_REGEX.match(phone_number):
                return True
            else:
                return False
        else:
            return False

    def post(self, request, *args, **kwargs):
        return <b>JsonResponse(</b>
            {'result': self.is_phone_valid(<b>self.request.POST.get('phone_number')</b>)}
        <b>)</b>
...