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> 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
相关产品推荐
相关产品推荐

