Rafi khan
Rafi khan

Reputation: 51

django User matching query does not exist

i'm trying to signup with an otp for verification by sending email to the user mail, but getting this error, it's might be problem with signup.html, from where trying to get specific user otp to validate the data, if is there any better solution do this with django would be appreciate, 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})  

signup.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 %}

Upvotes: 0

Views: 4397

Answers (1)

jvrn3
jvrn3

Reputation: 610

From the Django documentation:

This exception is raised by the ORM when an expected object is not found. For example, QuerySet.get() will raise it when no object is found for the given lookups.

That's probably due to one of your Model.get() methods, e.g: user = User.objects.get(email=get_user)

Try to handle it with a try/catch or use a .filter() method instead of .get()

Upvotes: 1

Related Questions