我试图在Django创建一个移动otp登录门户。我更改了用户模型并将电话号码作为主键,用户类如下所示
型号.py
class User(AbstractBaseUser):
username = models.CharField(max_length=50, blank=True, null=True, unique=True)
phone = models.CharField(validators=[phone_regex], max_length=10, unique=True, primary_key=True)
email = models.CharField(validators=[email_regex], max_length=50, blank=True)
phone_verified = models.BooleanField(default=False)
我在注册用户时没有收到任何错误。然后,我在用户的手机上发送otp,当我尝试验证在该手机上发送的otp时,请验证\u form.is \u valid()抛出错误。我用messages.error(request,“error”)检查了这个错误,显示这个手机的用户已经存在了。
下面是views.py、forms.py
视图.py
#function used to signup the user and to send the otp on the phone.
def phonesignup(request):
if request.method == 'POST':
phone_form = forms.PhoneSignupForm(request.POST)
if phone_form.is_valid():
user = phone_form.save(commit=False)
phone = phone_form.cleaned_data.get('phone')
password = BaseUserManager().make_random_password(length=12)
user.phone = phone
user.set_password(password)
user.save()
response = sendsmsotp(phone=phone)
# more-code
# function to verify the otp
def verifysmsotp(request):
if request.method == 'POST':
verify_form = forms.OTPVerifyForm(request.POST)
print(verify_form)
if verify_form.is_valid(): #<----------------------Form Error Here
sent_otp = verify_form.cleaned_data.get('otp')
phone = verify_form.cleaned_data.get('phone')
# more-code
表单.py
class PhoneSignupForm(forms.ModelForm):
phone = forms.CharField(label='Mobile Number', required=True)
class Meta:
model = User
fields = ('phone',)
def clean(self, *args, **kwargs):
cleaned_data = super().clean()
phone = cleaned_data.get('phone')
phone_q = User.objects.filter(phone=phone)
if phone_q.exists():
raise forms.ValidationError('Phone Already Present in Database')
return cleaned_data
class OTPVerifyForm(forms.ModelForm):
otp = forms.CharField(label='Enter OTP', required=True)
phone = forms.CharField(label='Enter Mobile Number', required=True)
class Meta:
model = User
fields = ('phone', 'otp')
def clean(self, *args, **kwargs):
cleaned_data = super().clean()
phone = cleaned_data.get('phone')
phone_q = User.objects.filter(phone=phone)
if phone_q.exists():
user = phone_q.first()
if user.phone_verified:
raise forms.ValidationError('Phone Already Verified')
return cleaned_data # returns phone and otp
请帮我渡过难关。如果你需要更多的信息请告诉我
注意:我没有尝试将主键更改为默认用户id,但我会在这篇文章之后这样做。如果你能想出一个以手机为主键的解决方案,那会很有帮助
OTPVerifyForm应该是普通表单,而不是模型表单
相关问题 更多 >
编程相关推荐