django 用户匹配查询不存在

时间:2021-04-26 15:02:21

标签: python django django-models django-views django-templates

我正在尝试通过向用户邮件发送电子邮件来注册 otp 以进行验证,但收到此错误,这可能是 signup.html 的问题,从那里尝试获取特定用户 otp 以验证数据,如果有没有更好的解决方案用 django 来做这件事将不胜感激,this is where it coming from

models.py

class User(AbstractUser):
    username = None
    email = models.EmailField(_('email address'), unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    is_buyer = models.BooleanField(default=False)
    is_vendor = models.BooleanField(default=False)

    objects = CustomUserManager()

    def __str__(self):
        return self.email


class UserOTP(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE)
    time_st = models.DateTimeField(auto_now = True)
    otp = models.SmallIntegerField()


class Vendor(models.Model):
    user = models.OneToOneField(User, related_name='vendor', on_delete=models.CASCADE)
    business_name = models.CharField(max_length=50)
   
    def __str__(self):
        return self.user.email

forms.py

class VendorSignUpForm(UserCreationForm):   
    business_name = forms.CharField(required=True)
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')


    class Meta:
        model = User
        fields = ('business_name', 'email', 'password1', 'password2', ) 
    
    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.is_vendor = True
        user.save()
        customer = Vendor.objects.create(user=user)
        customer.business_name=self.cleaned_data.get('business_name')
        customer.save()
        return user

views.py

def signup(request):
    if request.method == 'POST':
        get_otp = request.POST.get('otp')
        print(get_otp)

        if get_otp:
            get_user = request.POST.get('user')
            user = User.objects.get(email=get_user)
            if int(get_otp) == UserOTP.objects.filter(user = user).last().otp:
                user.is_active = True
                user.save()
                messages.success(request, f'Account is Created For {user.email}')
                return redirect('login')
            else:
                messages.warning(request, f'You Entered a Wrong OTP')
                return render(request, 'registration/signup.html', {'otp': True, 'user': user})

        form = VendorSignUpForm(request.POST)
        if form.is_valid():
            form.save()
            email = form.cleaned_data.get('email')
            user = User.objects.get(email=email)
            print(user)
            user.email = email
            user.is_active = False
            user.save()
            usr_otp = random.randint(100000, 999999)
            UserOTP.objects.create(user=user, otp = usr_otp)
            mess = f"Hello {user.email},\nYour OTP is {usr_otp}\nThanks!"
            send_mail( 'Welcome to Costume Base - Verify Your Email', 
            mess , settings.DEFAULT_FROM_EMAIL, [user.email], 
            fail_silently = False)

            return render(request, 'registration/signup.html', {'otp': True, user: user})  
    else:
        form = VendorSignUpForm()
    return render(request, 'registration/signup.html', {'form': form})  

注册.html

   {% block content %}

    <div>
        <h2>Signup</h2>

    </div>

    <div>
        {% if otp %}

        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom display">
                    <h3 class="float-left">Verify Your Email</h3>

            
                </legend>
                   ** is this input value showing the error? **
                <input type="hidden" value="{{user.email}}" name = 'user' >

                <div class="input-group mb-3">
                  <div class="input-group-prepend">
                    <span class="input-group-text" id="basic-addon1">OTP</span>
                  </div>
                  <input type="text" class="form-control" placeholder="Enter Your OTP" aria-label="OTP"
                   aria-describedby="basic-addon1" name = 'otp'>
                </div>
                
            </fieldset>
            <div class="form-grounp">
                <button class="btn mainbtn" type="submit">Verify</button>
                <small class="float-right text-muted"><i><a href="#" class="text-dark" 
                  onclick="ReSendOTP('{{user.email}}', 'resendOTPmess')"><i id="resendOTPmess">Resend</i> OTP</a></small>
            </div>
        </form>
        
          
{% else %}
        
        <form method="POST">
            {% csrf_token %}
            {{form.as_p}}

            <button type="submit">Register</button>
        </form>
    </div>
    {% endif %}
    {% endblock content %}

1 个答案:

答案 0 :(得分:0)

来自 Django 文档:

<块引用> <块引用>

当未找到预期对象时,ORM 会引发此异常。例如,QuerySet.get() 将在给定查找找不到对象时引发它。

这可能是由于您的 Model.get() 方法之一,例如: user = User.objects.get(email=get_user)

尝试使用 try/catch 或使用 .filter() 方法代替 .get()

相关问题