form.is\ u valid()在将phone用作主键时引发错误

2024-05-23 17:50:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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,但我会在这篇文章之后这样做。如果你能想出一个以手机为主键的解决方案,那会很有帮助


Tags: 用户pyformtruedataifrequestphone