Django报错:'QuerySet'对象无'name'属性,如何检查owner表用户名存在性?
问题:检查Owner表中是否存在指定名称时出现AttributeError错误
执行代码中if owners.name == name and owners.password == password :这一行时,出现错误:
AttributeError at /check 'QuerySet' object has no attribute 'name'
相关代码如下:
models.py
class owner(models.Model): id = models.AutoField name = models.CharField(max_length=255, blank=True, null=True) password = models.CharField(max_length=255) def __str__(self): return self.name
index.html
<form style="color:black" method="POST" action="check" class=" mt-3"> {% csrf_token %} <div class="row mb-3"> <label for="inputText" class="col-sm-3 col-form-label">Username</label> <div class="col-sm-8"> <input type="text" name="name" placeholder="Username" class="form-control"> </div> </div> <div class="row mb-3"> <label for="inputText" class="col-sm-3 col-form-label">Password</label> <div class="col-sm-8"> <input type="text" name="password" placeholder="password" class="form-control"> </div> </div> <button class="btn btn-success mb-3" type="submit">Login</button> <a class="btn btn-danger mb-3" href="index">Go Back</a> </form>
urls.py
path('index', views.index), path('check', views.check),
views.py
def check(request): owners = owner.objects.all() if request.method == "POST": name = request.POST.get('name') password = request.POST.get('password') if owners.name == name and owners.password == password : return render(request, "card/check.html")
解决方案
错误原因
owner.objects.all()返回的是QuerySet(查询集合),是数据库中所有owner对象的集合,并非单个对象,所以无法直接通过.name或.password访问属性。
正确写法
根据需求选择以下方式:
1. 仅检查是否存在匹配的用户(推荐快速验证)
直接用filter配合exists()判断是否存在符合条件的记录:
def check(request): if request.method == "POST": name = request.POST.get('name') password = request.POST.get('password') # 检查数据库中是否存在name和password都匹配的用户 is_valid = owner.objects.filter(name=name, password=password).exists() if is_valid: return render(request, "card/check.html") # 验证失败时返回登录页并提示错误 else: return render(request, "index.html", {"error": "用户名或密码错误"})
2. 获取用户对象(需后续使用用户信息时)
用get()获取单个匹配对象,捕获不存在或多匹配的异常:
def check(request): if request.method == "POST": name = request.POST.get('name') password = request.POST.get('password') try: # 获取唯一匹配的用户对象 owner_obj = owner.objects.get(name=name, password=password) return render(request, "card/check.html") except owner.DoesNotExist: # 没有找到对应用户 return render(request, "index.html", {"error": "用户名或密码错误"}) except owner.MultipleObjectsReturned: # 存在多个同名同密码的用户(需优化数据唯一性) return render(request, "index.html", {"error": "存在重复用户,请联系管理员"})
额外优化建议
- 模型命名规范:类名建议大写开头,改为
class Owner(models.Model)(符合Python编码规范) - 主键字段优化:Django会自动生成主键
id,可以删除id = models.AutoField这一行;如果手动定义,需加括号:id = models.AutoField(primary_key=True) - 密码安全存储:禁止明文存储密码,使用Django自带的密码哈希功能:
# 创建用户时哈希密码 from django.contrib.auth.hashers import make_password new_owner = Owner(name="test", password=make_password("123456")) new_owner.save() # 验证密码时 from django.contrib.auth.hashers import check_password try: owner_obj = Owner.objects.get(name=name) if check_password(password, owner_obj.password): return render(request, "card/check.html") else: return render(request, "index.html", {"error": "密码错误"}) except Owner.DoesNotExist: return render(request, "index.html", {"error": "用户名不存在"}) - 用户名唯一性:给
name字段添加唯一约束,避免重复:name = models.CharField(max_length=255, blank=True, null=True, unique=True)
内容的提问来源于stack exchange,提问作者Vaibhav
相关产品推荐
相关产品推荐

