You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django用户注册报错User matching query does not exist的解决方法

Django注册功能报错:User matching query does not exist 解决方法

问题场景

编写用户注册功能时,提交表单点击注册后出现错误提示User matching query does not exist,当前注册方法已被老师指出不规范。

错误信息

Internal Server Error: /register/
Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\Desktop\shop\account\views.py", line 38, in user_register
    if User.objects.get(username=username):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\db\models\manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\db\models\query.py", line 637, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

相关代码(views.py)

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User


def user_register(request):
    
    contaxt = {'errors': []}
    if request.user.is_authenticated:
        return redirect('/')
    else:
        if request.method == "POST":
            username = request.POST.get('username')
            email = request.POST.get('email')
            password1 = request.POST.get('password1')
            password2 = request.POST.get('password2')

            if password1 != password2:
                contaxt['errors'].append('پسورد مشابه نیست')
                return render(request, 'account/register.html', contaxt)

            if User.objects.get(username=username):
                contaxt['errors'].append('این نام کاربری وجود دارد')
                return render(request, 'account/register.html', contaxt)

            User.objects.create(username=username, email=email, password=password1)
            
            return redirect('/')

        return render(request, 'account/register.html')

解决方法

1. 修复用户名存在性判断逻辑

报错根源是User.objects.get(username=username):当查询的用户名不存在时,get()方法会直接抛出DoesNotExist异常,而非返回False。推荐用以下两种方式修复:

方式一:使用filter()+exists()(更高效)

替换原判断代码为:

if User.objects.filter(username=username).exists():
    contaxt['errors'].append('این نام کاربری وجود دارد')
    return render(request, 'account/register.html', contaxt)

filter()返回一个QuerySet(即使无结果也不会报错),exists()会检查QuerySet是否包含数据,返回布尔值,完美适配判断场景。

方式二:捕获异常

用try-except块处理get()可能抛出的异常:

try:
    User.objects.get(username=username)
    contaxt['errors'].append('این نام کاربری وجود دارد')
    return render(request, 'account/register.html', contaxt)
except User.DoesNotExist:
    # 用户名不存在,继续执行注册逻辑
    pass

2. 修复密码存储问题(额外优化)

原代码用User.objects.create()直接设置密码会导致明文存储,无法正常登录。Django提供了专门的create_user()方法自动处理密码哈希加密:

# 替换原创建用户的代码
User.objects.create_user(username=username, email=email, password=password1)

内容的提问来源于stack exchange,提问作者آرشام نوریان

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:07:20