12 django管理系统 - 注册与登录 - 登录

news2024/11/27 16:48:06

为了演示方便,我就直接使用models里的Admin来演示,不再创建用户模型了。

ok,先做基础配置

首先是在base.html中,新增登录和注册的入口

<ul class="nav navbar-nav navbar-right">
    <li><a href="/account/login/">登录</a></li>
    <li><a href="/account/register/">注册</a></li>
    
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
           aria-expanded="false">Dropdown <span class="caret"></span></a>
        <ul class="dropdown-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">Separated link</a></li>
        </ul>
    </li>
</ul>

接着去配置URL路径

urlpatterns = [
    # 部门管理
    path("dept/list/", dept.dept_list),
    path("dept/add/", dept.dept_add),
    path("dept/<int:nid>/edit_detail/", dept.dept_editdetail),
    path("dept/<int:nid>/delete/", dept.dept_delete),
    path("dept/search/", dept.dept_search),

    # 管理员管理
    path("admin/list/", admin.admin_list),
    path("admin/add/", admin.admin_add),

    # 登录
    path("account/login/", account.account_login),
    path("account/register/", account.account_register),

]

去my_views文件夹下创建account视图,接着定义account_login方法和account_register方法

# 登录
def account_login(request):
    pass

# 注册
def account_register(request):
    pass

现在开始进入登录模块的编写

我们让account_login去渲染account_login.html

# 登录
from django.shortcuts import render


def account_login(request):

    return render(request, "account_login.html")

然后在templates文件下下新建account_login.html,在bootstrap官网随便扒拉一个表单改改。

{% load static %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录界面</title>
    <!--引入css样式-->
    <link rel="stylesheet" href="{% static '/plugin/bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">

    </link>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .login-container {
            background-color: white;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        .login-container h2 {
            margin-bottom: 20px;
        }

        .form-group {
            margin-bottom: 15px;
        }

        .form-group label {
            display: block;
            margin-bottom: 5px;
        }

        .form-group input {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
        }

        .form-group input[type="submit"] {
            background-color: #5cb85c;
            color: white;
            border: none;
            cursor: pointer;
        }

        .form-group input[type="submit"]:hover {
            background-color: #4cae4c;
        }
    </style>
</head>
<body>
<div class="account">
    <h2>用户登录</h2>
    <form>
        <div class="form-group">
            <label for="exampleInputText">用户名:</label>
            <input type="email" id="exampleInputText" class="from-control" placeholder="用户名">
        </div>
        <div class="form-group">
            <label for="exampleInputPassword">密码:</label>
            <input type="password" id="exampleInputPassword" class="from-control" placeholder="密码">
        </div>

        <div class="form-group">
            <input type="submit" value="登  录" class="btn btn-primary">
        </div>

    </form>
</div>
</body>
</html>

界面如下:

页面显示出来之后,那么就可以进行表单内容验证部分的。

我们使用ModelForm来实现

首先,我们创建一个AccountModelForm,继承BootStrapModelForm。

因为我们只要Admin里的name和password,不需要sex,所以设置一下字段。

class AccountModelForm(BootStrapModelForm):
    class Meta:
        model = models.Admin
        fields = ["name", "password"]

接着就去取定义业务逻辑:

GET 请求: 创建一个空的 AccountModelForm实例。 将表单实例传递给 account_login.html 模板进行渲染,以便用户输入信息。

POST 请求: 使用 POST 数据创建 LoginForm 实例并验证数据。 验证通过后: 获取用户名和密码。 查询数据库,验证用户名和密码是否匹配。 匹配成功,则设置 session 并返回登录成功提示。 验证不通过: 返回带有错误信息的登录页面。

def account_login(request):
    if request.method == 'GET':
        form = AccountModelForm()
        context = {
            "form": form
        }
        return render(request, "account_login.html", context)
    
    form = AccountModelForm(data=request.POST)
    if form.is_valid():
        name = form.cleaned_data.get("name")
        password = form.cleaned_data.get("password")
        print(name, password)
        return HttpResponse("登录成功")
    else:
        return HttpResponse("登录失败")

因为表单数据没有进行数据库查询,我随便输入一下用户和密码看看能不能显示登录成功

可以看到能够进入表单验证阶段。

接下来是要编写account_login的表单验证业务逻辑。然后就去是数据库里找数据,判断是否在数据库中存在。

def account_login(request):
    """
    处理用户登录请求。

    参数:
    - request: HttpRequest对象,包含登录请求的数据。

    返回:
    - HttpResponse对象,表示登录结果或渲染的登录表单。
    """
    # 判断请求方法,GET请求表示用户希望看到登录页面
    if request.method == 'GET':
        # 初始化登录表单对象
        form = AccountModelForm()

        # 构建上下文,将表单传递给模板以渲染登录页面
        context = {
            "form": form
        }

        # 返回渲染后的登录页面
        return render(request, "account_login.html", context)
    
    # 非GET请求视为登录尝试,使用POST数据初始化表单对象
    form = AccountModelForm(data=request.POST)
    # print(".........", form) 用于调试的打印语句,输出表单数据

    # 验证表单数据有效性
    if form.is_valid():
        # 获取验证后的用户名和密码
        name = form.cleaned_data.get("name")
        password = form.cleaned_data.get("password")
        # 打印用户名和密码,用于调试
        print(name, password)

        # 在数据库中查询匹配的用户对象
        obj = models.Admin.objects.using("default").filter(name=name, password=password).first()
        
        # 如果查询结果为空,返回错误信息
        if not obj:
            return HttpResponse("用户名或密码错误")
        
        # 登录成功,返回成功信息
        return HttpResponse("登录成功")
    
    # 表单数据无效,重新渲染登录页面并显示错误信息
    return render(request, "account_login.html", {"form": form})

如果我随便输入数据,那么会提示用户名或者密码错误

我们去数据库中找一个存在的进行表单验证看看

可以看到,明显是可以登录成功。

接下来,我们还要保存session,为用户下次登录做准备。

我们先进navicat看一下session表,是空的。

然后修改account_logind的业务逻辑,保存session

def account_login(request):
    if request.method == 'GET':
        form = AccountModelForm()

        context = {
            "form": form
        }

        return render(request, "account_login.html", context)
    form = AccountModelForm(data=request.POST)
    # print(".........", form)
    if form.is_valid():
        name = form.cleaned_data.get("name")
        password = form.cleaned_data.get("password")
        print(name, password)
        obj = models.Admin.objects.using("default").filter(name=name, password=password).first()
        if not obj:
            return HttpResponse("用户名或密码错误")

        # 保存session
        request.session["user_info"] = {"id": obj.id, "name": obj.name}  # 设置session
        print('request.session["user_info"]...is', request.session["user_info"])
        # return HttpResponse("登录成功")
        # 返回管理员列表
        return redirect('/admin/list')

    return render(request, "account_login.html", {"form": form})

我们尝试登录一下,看看登录后是否跳转到管理员列表,并且看看session是否保存。

用户名:Kong Sze Yu,密码:Nd2ZeMwBhx

我们去navicat看看session

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程 在日常开发中&#xff0c;许多开发者需要远程连接服务器进行代码编辑和调试。Visual Studio Code&#xff08;VSCode&#xff09;提供了一个非常强大的扩展——Remote-SSH&#xff0c;它允许我们通过 SSH 协议直接连接远程…

一图读懂“低空经济”

&#x1f482; 个人主页: 同学来啦&#x1f91f; 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏和订阅专栏哦 文章目录 ✈️ 一、低空经济简介&#x1f534; 1、基本含义&#x1f7e0; 2、…

【免费领取】基于javaweb实现的的日志管理系统

主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 本工作日志管理系统是一个面向中小企业的简单的工作管理系统&#xff0c;它主要实现公…

【Python】Pandas基础操作手册(上)

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是【Python】Pandas基础操作手册&#xff08;上&#xff09;本次主要讲解, python pandas 模块的一些基本概念, 以及了解 Dataframe 对象的创建, 赋值, 保存. 一起来看看叭…

【SpringBoot】17 多文件上传(Thymeleaf + MySQL)

Git仓库 https://gitee.com/Lin_DH/system 文件上传 可参考上一篇【SpringBoot】16 文件上传&#xff08;Thymeleaf MySQL&#xff09; https://blog.csdn.net/weixin_44088274/article/details/143004298 介绍 文件上传是指将本地的图片、视频、音频等文件上传到服务器&…

php生成PDF文件(FPDF)

FPDF即“Free PDF”&#xff0c;FPDF类库提供了基本的PDF创建功能&#xff0c;其源代码和使用权是免费的。 PDF格式文档优势 通用&#xff1a;PDF文档在UNIX和Windows系统均可正常使用。 安全&#xff1a;PDF文档可设置为只读模式&#xff0c;并且可以添加密码等保护措施。 美…

【PDF文件】默认被某种软件打开,如何进行修改?

当有时下载某种软件后&#xff0c;电脑中的PDF文件就默认由该种软件打开&#xff0c;每次需要右键选择打开方式才能选择需要的其他软件打开。如下图所示。 修改方法&#xff1a; &#xff08;1&#xff09;点击电脑的“设置”&#xff0c;选择应用 &#xff08;2&#xff09;…

深入浅出理解BLE AUDIO CSIS

CSIS是Coordinate Sets Identification service,翻译过来就是协调集识别服务。什么是协调集&#xff0c;可以理解为具有相同特征的一伙设备&#xff0c;最典型的就是左右两个蓝牙耳机是一个协调集&#xff0c;所以它们具有相同的协调集标志&#xff0c;但是具有相同协调集的设备…

disql 全量备份SQL脚本DM7/DM8

disql 全量备份SQL脚本DM7/DM8 环境介绍1 全量备份前准备工作2 全量备份2.1 cd 到数据库bin 目录,并编辑文件2.2 编写数据库全量备份SQL 脚本2.3 执行编写的sql脚本2.4 编写Linux定时任务 , 每月执行全量备份 3 备份还原4 增量备份配置5 更多达梦数据库学习使用列表 环境介绍 …

CTA-GAN:基于生成对抗网络对颈动脉和主动脉的非增强CT影像进行血管增强

写在前面 目前只分析了文章的大体内容和我个人认为的比较重要的细节&#xff0c;代码实现还没仔细看&#xff0c;后续有时间会补充代码细节部分。 文章地址&#xff1a;Generative Adversarial Network-based Noncontrast CT Angiography for Aorta and Carotid Arteries 代…

【C++】STL容器-string常用接口

1.string类的优势及重要性&#xff08;部分&#xff09; C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&…

【Unity实战笔记】第二一 · 基于状态模式的角色控制——以UnityChan为例

目录 一 内容摘要二 前言三 状态模式的必要性3.1 非状态模式的角色控制3.2 简易状态模式的角色控制3.3 状态模式3.3.1 IState3.3.2 IdleState3.3.3 RunState3.3.4 JumpState3.3.5 PlayerController_ComplexStateMode3.3.6 注意事项 3.4 SMB 四 基于SMB的角色控制4.1 项目实战案…

Java | Leetcode Java题解之第497题非重叠矩形中的随机点

题目&#xff1a; 题解&#xff1a; class Solution {Random rand;List<Integer> arr;int[][] rects;public Solution(int[][] rects) {rand new Random();arr new ArrayList<Integer>();arr.add(0);this.rects rects;for (int[] rect : rects) {int a rect[0…

【大模型问答测试】大模型问答测试脚本实现(第二版)——接入pytest与代码解耦

背景 接上一篇&#xff0c;【大模型问答测试】大模型问答测试脚本实现&#xff08;第一版&#xff09;。 在实现自动化的时候&#xff0c;原先把很多方法与request请求写在一块了&#xff0c;趁着目前实现接口数量较少&#xff0c;决定对代码进行解耦&#xff0c;并且清晰目录…

《梦里花落知多少》凄美地,如同散落的花

《梦里花落知多少》凄美地&#xff0c;如同散落的花 三毛&#xff08;1943/3/26~1991/01/04&#xff09;&#xff0c;本名陈平&#xff0c;当代女作家&#xff0c;旅行家。著有《雨季不再来》《撒哈拉的故事》《哭泣的骆驼》《稻草人手记》《温柔的夜》《梦里花落知多少》等作品…

HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException

HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException 异常信息&#xff1a; Hive:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /xxxdir is exceeded: quota10000 file count15001N…

代码随想录-哈希表-有效的字母异位词

思路 哈希表的三种方式:数组、set、map 本题采用数组形式的哈希表来解决 三个注意事项: ①数组哈希表定义&#xff0c;包括思路和原始大小 ②Java中字符串的某个字符访问方式&#xff0c;字符串长度的方法 ③for-each循环的书写方式 代码 class Solution {public boole…

Python 爬虫下载图片

使用免费的代理ip进行网络请求,降低了反爬机制的触发率。加入自动发送邮件的功能,在代码运行出错的时候可以及时收到提醒消息。 主程序代码: import requests import os import time from lxml import etree from bs4 import BeautifulSoup import random # 自定义模块,发…

安全防护修改用户sudo权限

修改ssh端口 vim /etc/ssh/sshd_config 修改port端口为60022端口&#xff0c;端口最大为65535 修改完&#xff0c;重启服务 可以看到此时ssh监听端口为60022,此时远程登陆时就需要用端口60022&#xff0c;原来的22端口拒绝访问 下载nmap端口扫描工具 用命令nmap 192.168.45.…

CZX前端秘籍2

vue生命周期&#xff08; 组件从创建到销毁的过程就是它的生命周期&#xff09; 创建前 beforeCreat&#xff08; 在这个阶段属性和方法都不能使用&#xff09; 创建时 created&#xff08; 这里时实例创建完成之后&#xff0c; 在这里完成了数据监测&#xff0c; 可以使用数…