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

基于自定义companyUsers模型的Django替代登录实现需求

不依赖Django默认认证系统的自定义登录实现

1. 确认自定义模型结构

假设你的companyUsers模型至少包含用户名和哈希存储的密码字段(必须哈希,禁止明文存储):

# models.py
from django.db import models

class companyUsers(models.Model):
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=50, unique=True)
    password = models.CharField(max_length=255)  # 存储哈希后的密码
    # 可按需添加其他字段:email、phone等

2. 密码哈希处理

创建用户时,必须用Django的make_password生成哈希密码,示例:

# 可在Django shell或注册视图中执行
from django.contrib.auth.hashers import make_password
from .models import companyUsers

# 创建测试用户
user = companyUsers(username="test_user", password=make_password("your_password"))
user.save()

3. 登录表单

用Django表单做前端输入验证:

# forms.py
from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(label="用户名", max_length=50)
    password = forms.CharField(label="密码", widget=forms.PasswordInput)

4. 视图逻辑

处理登录请求、验证凭证、维护登录状态(通过session):

# views.py
from django.shortcuts import render, redirect
from django.contrib.auth.hashers import check_password
from .models import companyUsers
from .forms import LoginForm

def login(request):
    if request.method == "POST":
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data["username"]
            password = form.cleaned_data["password"]
            
            # 查询用户
            try:
                user = companyUsers.objects.get(username=username)
                # 验证密码哈希是否匹配
                if check_password(password, user.password):
                    # 将用户ID存入session,标记登录状态
                    request.session["user_id"] = user.id
                    return redirect("dashboard")  # 登录成功跳转到目标页面
                else:
                    form.add_error("password", "密码错误")
            except companyUsers.DoesNotExist:
                form.add_error("username", "用户不存在")
        return render(request, "login.html", {"form": form})
    else:
        form = LoginForm()
        return render(request, "login.html", {"form": form})

# 登录后才能访问的页面示例
def dashboard(request):
    # 检查session中的用户ID
    user_id = request.session.get("user_id")
    if not user_id:
        return redirect("login")
    
    try:
        user = companyUsers.objects.get(id=user_id)
        return render(request, "dashboard.html", {"user": user})
    except companyUsers.DoesNotExist:
        # 清除无效的session记录
        del request.session["user_id"]
        return redirect("login")

# 登出功能
def logout(request):
    # 清除所有session数据
    request.session.flush()
    return redirect("login")

# 自定义登录校验装饰器(可选,简化重复校验)
def login_required(view_func):
    def wrapper(request, *args, **kwargs):
        user_id = request.session.get("user_id")
        if not user_id:
            return redirect("login")
        try:
            companyUsers.objects.get(id=user_id)
            return view_func(request, *args, **kwargs)
        except companyUsers.DoesNotExist:
            del request.session["user_id"]
            return redirect("login")
    return wrapper

# 使用装饰器的示例视图
@login_required
def profile(request):
    user = companyUsers.objects.get(id=request.session["user_id"])
    return render(request, "profile.html", {"user": user})

5. 模板文件

登录页面(login.html)

<!-- templates/login.html -->
<!DOCTYPE html>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
    <h2>登录</h2>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">登录</button>
    </form>
</body>
</html>

仪表盘页面(dashboard.html)

<!-- templates/dashboard.html -->
<!DOCTYPE html>
<html>
<head>
    <title>用户仪表盘</title>
</head>
<body>
    <h2>欢迎,{{ user.username }}!</h2>
    <a href="{% url 'logout' %}">退出登录</a>
</body>
</html>

6. URL配置

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("login/", views.login, name="login"),
    path("dashboard/", views.dashboard, name="dashboard"),
    path("logout/", views.logout, name="logout"),
    path("profile/", views.profile, name="profile"),  # 装饰器示例视图的URL
]

注意事项

  • 确保django.contrib.sessions在INSTALLED_APPS中,且django.contrib.sessions.middleware.SessionMiddleware在中间件配置里(Django默认已包含)
  • 模板必须添加{% csrf_token %},否则POST请求会被Django的CSRF保护拦截
  • 绝不允许明文存储密码,必须使用make_password生成哈希值,用check_password验证匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:20:05