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

Django基于Vehicle模型车主信息实现登录认证失败求助

自定义Vehicle模型登录失败的排查与修复

问题背景

需基于Vehicle模型中的ownername和vehicle_password实现车主登录,但提交登录信息后页面仅刷新,无法完成登录流程。

核心错误点与修复方案

1. 默认认证后端不支持自定义Vehicle模型

Django自带的authenticate()函数默认仅识别内置User模型,无法直接验证Vehicle模型的凭证,需自定义认证后端:

步骤1:创建认证后端文件

在app目录下新建backends.py,添加以下代码:

from django.contrib.auth.backends import BaseBackend
from .models import Vehicle

class VehicleAuthBackend(BaseBackend):
    def authenticate(self, request, ownername=None, password=None):
        try:
            vehicle = Vehicle.objects.get(ownername=ownername)
            if vehicle.check_password(password):
                return vehicle
        except Vehicle.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return Vehicle.objects.get(pk=user_id)
        except Vehicle.DoesNotExist:
            return None

步骤2:配置认证后端

在项目settings.py中添加:

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'your_app_name.backends.VehicleAuthBackend',  # 替换为实际app名称
]

2. Vehicle模型密码未哈希存储

当前vehicle_password为明文存储,不符合安全规范且无法适配Django密码验证逻辑,修改模型:

# models.py
from django.contrib.auth.hashers import make_password, check_password

class Vehicle(models.Model):
    # 保留原有字段,仅修改密码相关逻辑
    vehicle_password = models.CharField(max_length=100)

    def save(self, *args, **kwargs):
        # 保存时自动哈希密码(仅对未哈希的密码处理)
        if self.vehicle_password and not self.vehicle_password.startswith('pbkdf2_sha256$'):
            self.vehicle_password = make_password(self.vehicle_password)
        super().save(*args, **kwargs)

    def check_password(self, raw_password):
        # 自定义密码验证方法
        return check_password(raw_password, self.vehicle_password)

3. 视图函数逻辑缺陷

原视图存在POST请求处理不完整、认证参数传递错误的问题,修改member_login视图:

def member_login(request):
    if request.method == 'POST':
        ownername = request.POST.get('ownername')
        password = request.POST.get('vehicle_password')

        if ownername and password:
            # 传递自定义认证所需参数
            user = authenticate(request, ownername=ownername, password=password)
            if user is not None:
                login(request, user)
                return redirect('member_home')
            else:
                # 向模板传递错误标记
                return render(request, 'member_login.html', {'error': 'yes'})
        else:
            return render(request, 'member_login.html', {'error': 'yes'})
    # GET请求直接返回登录页
    return render(request, 'member_login.html')

4. 模板代码问题

member_login.html修复

  • 补充缺失的<form>标签,指定提交方法与地址
  • 移除无效的变量判断,改用视图传递的error变量:
<form method="POST" action="{% url 'member_login' %}">
    {% csrf_token %}
    <label for="ownername"><b>Ownername</b></label>
    <input type="text" name="ownername" class="form-control" required>

    <label for="vehicle_password"><b>Password</b></label>
    <input type="password" name="vehicle_password" class="form-control" required>

    <br>
    <input type="submit" value="Login" class="btn btn-primary form-control">
</form>

{% if error == "yes" %}
<script>
    alert('Invalid Login Credentials, Try Again...');
</script>
{% endif %}

member_home.html修复

  • 登录后用户对象为Vehicle实例,通过request.user获取,修正用户名显示逻辑:
{% if request.user.is_authenticated %}
<br> &nbsp;&nbsp;Welcome <b style="text-transform: capitalize; color: blue">{{ request.user.ownername }}</b>
{% endif %}

5. 额外修正

  • 修复Vehicle类中__str__方法的缩进错误(原代码为全局方法,需缩进至类内部):
class Vehicle(models.Model):
    # 所有字段定义
    def __str__(self):
        return self.parkingnumber
  • 修改模型后执行数据库迁移:
python manage.py makemigrations
python manage.py migrate

内容的提问来源于stack exchange,提问作者user19968173

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:25:06