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,提问作者آرشام نوریان
相关产品推荐
相关产品推荐

