【问题标题】:Exception: Matching query does not exist例外:匹配的查询不存在
【发布时间】:2022-01-03 07:35:56
【问题描述】:

我正在尝试为请求忘记密码的用户生成令牌。我有一个模型来处理和存储它。

models.py


class ForgetPassword(models.Model):

    user = models.ForeignKey(CustomUser, on_delete= models.CASCADE)
    forget_password_token = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add= True)

    def __str__(self):
        return self.user.email

处理请求的视图函数如下

views.py

def forget_password(request):

    try:

        if request.method == 'POST':
            user_email = request.POST.get('email')

            if CustomUser.objects.filter(email = user_email).exists():
                
                user_obj = CustomUser.objects.get(email = user_email)

                name = user_obj.full_name
                plan = user_obj.plan

                print("\n this is the user : ", user_obj, " this is its name : ", name,"\n")

                token = str(uuid.uuid4())
                
                fp = ForgetPassword.objects.get(user = user_obj)
                fp.forget_password_token = token
                fp.save()

                forget_password_mail.delay(user_email, name, token)
                messages.info(request, 'An email has been sent to your registered email.')
                return redirect('forget-password')  
            else:
                messages.info(request, 'User does not exist')
                return redirect('forget-password')   

    except Exception as e:

        print("\nthe exception is comming from forget_password : ", e, "\n")
    
    return render(request, 'fp_email_form.html')

因此,我在这里尝试首先从我的 CustomUser 模型中获取 user_obj 中的用户,然后尝试在 ForgetPassword 模型中获取相同的用户并将令牌存储到该用户。但我得到以下异常

ForgetPassword matching query does not exist.

请建议或纠正我的错误。

【问题讨论】:

    标签: django django-views django-queryset


    【解决方案1】:

    您没有与您尝试获取的用户对象关联的 ForgetPassword 对象,

    fp = ForgetPassword.objects.get(user = user_obj) 相反,您应该使用get_or_create

    reference link

    【讨论】:

    • 我实际上试过了,对象是在没有存储令牌的情况下创建的,我得到了这个异常“'tuple' object has no attribute 'forget_password_token'”
    • get_or_create 返回两个对象,在您的情况下(fp_obj,已创建)。而且您必须将令牌分配给 fp_obj。请阅读它是如何工作的,你会明白的。
    • 好的,我现在明白了,我们必须在它自己的函数中传递忘记密码令牌。并且只是为了澄清我们只能在对象存在时使用 get() 对吗?否则我们必须使用 get_or_create?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2012-05-10
    • 2015-01-28
    • 2020-10-15
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多