我如何在基于 api 的 django class 视图中调用自己的方法
How can i call own method in django class based api views
我想使用 phone 号码作为用户名创建帐户并生成 otp 代码。现在我想验证我的 phone 号码。我创建了一个方法 is_phone_valid 来验证我的 phone 号码,但通过 post 方法调用它,但出现错误
这是我的 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
如果你想提取 POST parameters [wiki] 中的 phone 号码,那么你应该在 self.request.POST
中访问它。
此外,您不能 return 布尔值作为请求的结果。这需要是 HttpResponse
,例如 JsonResponse
object [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>
您必须定义 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)})
您似乎在使用 Django REST Framework. If so, use field-level--DRF doc validation of DRF Serializers,如下所示
# 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(...)
方法[=12] =]class.
您 posted 的回溯说明它找不到您在 post 方法中传递给 self.is_phone_valid(phone_number)
的 phone_number
。
其次,您的问题是如何从 class 内部调用 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)
我想使用 phone 号码作为用户名创建帐户并生成 otp 代码。现在我想验证我的 phone 号码。我创建了一个方法 is_phone_valid 来验证我的 phone 号码,但通过 post 方法调用它,但出现错误
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
如果你想提取 POST parameters [wiki] 中的 phone 号码,那么你应该在 self.request.POST
中访问它。
此外,您不能 return 布尔值作为请求的结果。这需要是 HttpResponse
,例如 JsonResponse
object [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>
您必须定义 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)})
您似乎在使用 Django REST Framework. If so, use field-level--DRF doc validation of DRF Serializers,如下所示
# 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(...)
方法[=12] =]class.
您 posted 的回溯说明它找不到您在 post 方法中传递给 self.is_phone_valid(phone_number)
的 phone_number
。
其次,您的问题是如何从 class 内部调用 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)