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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:35:20