django实现用户的注册、登录、注销功能

创建django项目的步骤:Django项目的创建步骤-CSDN博客

一、前置工作

配置数据库,设置数据库引擎为mysql

1、在settings文件中找到DATABASES, 配置以下内容
DATABASES = {"default": {'ENGINE': 'django.db.backends.mysql',  # 数据库引擎'NAME': 'django_test',  # 连接的数据库, 一定要存在'HOST': '127.0.0.1',  # mysql的ip地址, 这里是本地'PORT': 3306,  # mysql的默认端口'USER': 'root',  # mysql的用户名'PASSWORD': 'xxx'  # mysql的密码}
}

可能会提示以下内容:

安装即可: pip install mysqlclient -i  https://pypi.tuna.tsinghua.edu.cn/simple

二、编写用户模型

django中使用ORM来存数据到数据库

ORM模型(对象关系映射):

 一个 模型类对应数据库中的一张表

一个属性对应数据库中的一个字段

用户表的字段:用户名、密码(可以自己扩展)

1、用户模型

2、创建好模型后要执行迁移数据的命令:

生成迁移文件:python manage.py  makemigrations

迁移生效(同步到数据库):python manage.py  migrate

3、迁移成功后,migrations文件夹下会出现迁移文件,该文件记录着模型的相关信息,001表示第一次迁移.

三、编写表单校验,以注册表单校验为例

使用django自带的Form类来实现校验

1、对字段的校验,这里只截了用户名的校验,其他字段都差不多

2、对整个表单的校验:

User需要从models.py文件中导入

3、form表单中自定义的其他方法:

四、编写前端页面,纯html,文件写在templates文件夹中

使用了模板的方式嵌入数据

超链接的跳转连接:{% url "命名空间:路由的name值" %},有命名空间一定要标注命名空间,没有则:{% url "路由的name值" %}

1、index.html

2、register.html

form.non_field_errors:表当校验时,表单的错误,就是forms.py文件中的

raise  forms.ValidationError("错误信息")。

form.errors.username: 表单校验时,用户名的错误,就是forms.py文件中的error_messages信息,密码校验也是如此。

3、login.html


 

五、编写视图类来实现登录、注册功能

如果是get请求就执行get方法,是post请求就执行post方法,在form标签中的methos方法中可以指定。

form.is_valid():用来校验表单,校验成功返回True, 失败则返回False。

post的方法的实例化表单对象:实例化表单对象时一定要加request.POST,否则拿不到数据。

redirect:  重定向到其他视图函数。

form对象:实例化表单对象,用来进行表单的各种存在,校验,错误信息等待

request.session['username'] = request.POST['username']:  设置session值为用户名(其他值也可以)

六、编写首页和注销视图函数
1、首页函数

request.session.get():通过注册时设置的session中来获取用户,通过这个判断是否有登录的用户,可以与前端交互,有的话就显示注销,没有的话显示注册和登录

2、注销函数

清除session值即可

七、编写路由
1、在主路由中include分路由,并设置命名空间

命名空间:当有多个应用时建议用, 能更好的区分各个应用,使用namespace关键字设置

2、在app下创建一个urls.py文件,编写以下内容

注意:一定要加app_name, 视图类一定要加.as_view()

八、django自带的管理后台

使用python manage.py createtsuperuser创建超级用户

1、在admin.py文件中注册模型

list_display:在后台管理中要显示的字段

admin.site.site_header:后台管理的标题

2、在模型(models.py)中添加

3、使用注册的超级用户登录

九、具体的文件
1、models.py
from django.db import modelsclass User(models.Model):# 定义变量,对应数据库的表的字段# username参数:参数1:后台管理显示的内容,参数2:最大长度, CharField类型必须指定,参数3:不能为空,参数4:唯一username = models.CharField('用户名', max_length=10, null=False, unique=True)password = models.CharField('密码', max_length=255, null=False)# create_time参数:参数2:记录数据第一次创建的时间,自动记录到数据库create_time = models.DateTimeField('注册时间', auto_now_add=True)# 设置后台管理class Meta:app_label = 'app'  # 属于那个appverbose_name = '用户'verbose_name_plural = verbose_name# 输出对象时用到的def __str__(self):return self.username
2、forms.py
from django import forms
from .models import Userclass RegisterForm(forms.Form):# 用户名username = forms.CharField(required=True,  # 不能为空,必须max_length=10,  # 最大长度min_length=4,  # 最小长度error_messages={'required': "不能为空",'max_length': "长度不能大于10",'min_length': "长度不能小于4",})# 密码password = forms.CharField(required=True,  # 不能为空,必须max_length=16,  # 最大长度min_length=8,  # 最小长度error_messages={'required': "不能为空",'max_length': "长度不能大于16",'min_length': "长度不能小于8",})# 校验def clean(self):# 获取输入的用户名username = self.cleaned_data.get('username')user = User.objects.filter(username=username)  # 获得一个查询集,可以理解为一个列表# 用户存在if user.exists():raise forms.ValidationError("用户已存在")return self.cleaned_data# 存入数据库def save(self):username = self.cleaned_data.get('username')password = self.cleaned_data.get('password')# 存入数据库user = User(username=username, password=password)user.save()class LoginForm(forms.Form):# 用户名username = forms.CharField(required=True,  # 不能为空,必须max_length=10,  # 最大长度min_length=4,  # 最小长度error_messages={'required': "不能为空",'max_length': "长度不能大于10",'min_length': "长度不能小于4",})# 密码password = forms.CharField(required=True,  # 不能为空,必须max_length=16,  # 最大长度min_length=8,  # 最小长度error_messages={'required': "不能为空",'max_length': "长度不能大于16",'min_length': "长度不能小于8",})# 校验def clean(self):# 获取输入的信息username = self.cleaned_data.get('username')password = self.cleaned_data.get('password')user = User.objects.filter(username=username)  # 获得一个查询集,可以理解为一个列表if user.exists():if user[0].password != password:raise forms.ValidationError("密码错误")else:raise forms.ValidationError("用户不存在")return self.cleaned_data
3、admin.py
from django.contrib import admin
from .models import User# Register your models here.
@admin.register(User)
class UserAdmin(admin.ModelAdmin):list_display = ['id', 'username', 'create_time']admin.site.site_header = 'django后台管理'
4、views.py
from django.shortcuts import render, HttpResponse, redirect
from django.views import View
from .models import User
from .forms import RegisterForm, LoginForm# Create your views here.def index(request):username = request.session.get('username', default=0)  # 通过session获取用户名,给默认值防止报错user = User.objects.filter(username=username).first()return render(request, 'index.html', {'user': user})class RegisterView(View):def get(self, request):form = RegisterForm()return render(request, 'register.html', {'form': form})def post(self, request):form = RegisterForm(request.POST)if form.is_valid():form.save()return redirect('app:login')return render(request, 'register.html', {'form': form})class LoginView(View):def get(self, request):form = LoginForm()return render(request, 'login.html', {'form': form})def post(self, request):form = LoginForm(request.POST)print("登录")if form.is_valid():# 设置sessionrequest.session['username'] = request.POST['username']return redirect('app:index')return render(request, 'login.html', {'form': form})# 注销
def Logout(request):request.session.clear()  # 清除sessionreturn redirect('app:index')
5、app中的urls.py
from django.urls import path
from .views import *app_name = 'app'urlpatterns = [path('', index, name='index'),  # 首页path('register/', RegisterView.as_view(), name='register'),  # 注册path('login/', LoginView.as_view(), name='login'),  # 登录path('logout', Logout, name='logout'),  # 注销
]
6、主路由urls.py
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path("admin/", admin.site.urls),path('', include('app.urls', namespace='app'))
]
7、index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>{% if user %}<h1>欢迎{{ user.username }}进入首页!!!</h1><a href="{% url 'app:logout' %}">注销</a>
{% else %}<h1>请注册或登录</h1><a href="{% url 'app:register' %}">注册</a><a href="{% url 'app:login' %}">登录</a>
{% endif %}</body>
</html>
8、register.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册</title>
</head>
<body>
<h3>注册</h3>
<a href="{% url 'app:login' %}">登录</a>|
<a href="{% url 'app:index' %}">首页</a>
<form action="{% url 'app:register'  %}" method="post">{% csrf_token %}<div><p style="color: red">{{ form.non_field_errors  }}</p></div><div><lable>用户名</lable><label><input type="text" name="username"></label><p style="color: red">{{ form.errors.username }}</p></div><div><lable>密码</lable><label><input type="password" name="password"><p style="color: red">{{ form.errors.password }}</p></label></div><button type="submit">注册</button>
</form>
</body></html>
9、login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title>
</head>
<body>
<h3>登录</h3>
<a href="{% url 'app:register' %}">注册</a>|
<a href="{% url 'app:index' %}">首页</a>
<form action="{% url 'app:login'  %}" method="post">{% csrf_token %}<div><p style="color: red">{{ form.non_field_errors  }}</p></div><div><lable>用户名</lable><label><input type="text" name="username"><p style="color: red">{{ form.errors.username }}</p></label></div><div><lable>密码</lable><label><input type="password" name="password"><p style="color: red">{{ form.errors.password }}</p></label></div><button>登录</button>
</form></body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot和mybatis的RealWorld后端项目实战二之实现tag接口

修改pom.xml 新增tag数据表 SET FOREIGN_KEY_CHECKS0;-- ---------------------------- -- Table structure for tags -- ---------------------------- DROP TABLE IF EXISTS tags; CREATE TABLE tags (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,PR…

【hadoop大数据集群 2】

【hadoop大数据集群 2】 文章目录 【hadoop大数据集群 2】1. 虚拟机克隆2. 时间同步3. 环境变量配置、启动集群、关闭集群 1. 虚拟机克隆 克隆之后一定要重新生成新虚拟机唯一的MAC地址和UUID等&#xff0c;确保新虚拟机与源虚拟机在网络拓扑中不发生冲突。 注意1.生成新的MA…

IDEA关联数据库

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …

Spring Boot2(Spring Boot 的Web开发 springMVC 请求处理 参数绑定 常用注解 数据传递)

目录 一、Spring Boot 的Web开发 1. 静态资源映射规则 2. enjoy模板引擎 二、springMVC 1. springMVC-请求处理 测试&#xff1a; 以post方式请求 限制请求携带的参数 GetMapping 查询 PostMapping 新增 DeleteMapping删除 PutMapping 修改 2. springMVC-参…

电子画册制作攻略:如何让你的作品吸引眼球

随着数字化时代的到来&#xff0c;电子画册作为一种新兴的传播媒介&#xff0c;已经越来越受到人们的青睐。它不仅能够以生动的形式展现内容&#xff0c;还可以轻松地实现互动和分享。然而&#xff0c;如何让你的电子画册作品在众多竞争中脱颖而出&#xff0c;吸引更多眼球呢&a…

景联文科技构建高质量心理学系知识图谱,助力大模型成为心理学科专家

心理大模型正处于快速发展阶段&#xff0c;在临床应用、教育、研究等多个领域展现出巨大潜力。 心理学系知识图谱能够丰富心理大模型的认知能力&#xff0c;使其在处理心理学相关问题时更加精确、可靠和有洞察力。这对于提高心理健康服务的质量和效率、促进科学研究以及优化教育…

【MySQL进阶篇】SQL优化

1、插入数据 insert优化 批量插入&#xff1a; insert into tb_user values(1,tom),(2,cat),(3,jerry); 如果插入数据过大&#xff0c;可以将业务分割为多条insert语句进行插入。 手动提交事务&#xff1a; start transaction; insert into tb_user values(1,tom),(2,cat),(3…

Linux——多路复用之select

目录 前言 一、select的认识 二、select的接口 三、select的使用 四、select的优缺点 前言 在前面&#xff0c;我们学习了五种IO模型&#xff0c;对IO有了基本的认识&#xff0c;知道了select效率很高&#xff0c;可以等待多个文件描述符&#xff0c;那他是如何等待的呢&a…

视频活码如何在线制作?分享快速制作二维码的方法

视频想要快速的分享现在有很多的人会选择二维码的方式&#xff0c;将视频转换成二维码通过手机扫码就能够快速在线查看视频内容&#xff0c;这样可以不占用扫码者自身的内存&#xff0c;随时扫码从云端调取内容查看&#xff0c;更加的方便快捷便于内容的分享。那么具体该如何实…

搭建个人智能家居 7 - 空气颗粒物检测

搭建个人智能家居 7 - 空气颗粒物检测 前言说明PMS5003ESPHomeHomeAssistant结束 前言 到目前为止&#xff0c;我们这个智能家居系统添加了4个外设&#xff0c;分别是&#xff1a;LED灯、RGB灯、DHT11温度传感器和SGP30。今天继续添加环境测量类传感器“PMS5003空气颗粒物检测…

【Leetcode】二十一、前缀树 + 词典中最长的单词

文章目录 1、背景2、前缀树Trie3、leetcode208&#xff1a;实现Trie4、leetcode720&#xff1a;词典中最长的单词 1、背景 如上&#xff0c;以浏览器搜索时的自动匹配为例&#xff1a; 如果把所有搜索关键字放一个数组里&#xff0c;则&#xff1a;插入、搜索一个词条时&#x…

VisualRules-Web案例展示(一)

VisualRules单机版以其卓越的功能深受用户喜爱。现在&#xff0c;我们进一步推出了VisualRules-Web在线版本&#xff0c;让您无需安装任何软件&#xff0c;即可在任何浏览器中轻松体验VisualRules的强大功能。无论是数据分析、规则管理还是自动化决策&#xff0c;VisualRules-W…

【深度学习】PyTorch框架(3):优化与初始化

1.引言 在本文中&#xff0c;我们将探讨神经网络的优化与初始化技术。随着神经网络深度的增加&#xff0c;我们会遇到多种挑战。最关键的是确保网络中梯度流动的稳定性&#xff0c;否则可能会遭遇梯度消失或梯度爆炸的问题。因此&#xff0c;我们将深入探讨以下两个核心概念&a…

VScode:前端项目中yarn包的安装和使用

一、首先打开PowerShell-管理员身份运行ISE 输入命令&#xff1a; set-ExecutionPolicy RemoteSigned 选择“全是”&#xff0c;表示允许在本地计算机上运行由本地用户创建的脚本&#xff0c;没有报错就行了 二、接着打开VScode集成终端&#xff0c;安装yarn插件 输入 npm ins…

活动回顾 | AutoMQ 联合 GreptimeDB 共同探讨新能源汽车数据基础设施

7 月 13 日&#xff0c;AutoMQ 携手 GreptimeDB“新能源汽车数据基础设施” 主题 meetup 在上海圆满落幕。本次论坛多角度探讨如何通过创新的数据管理和存储架构&#xff0c;提升汽车系统的性能、安全性和可靠性&#xff0c;从而驱动行业的持续发展和创新&#xff0c;涵盖 Auto…

全时守护,无死角监测:重点海域渔港视频AI智能监管方案

一、方案背景 随着海洋经济的快速发展和海洋资源的日益紧缺&#xff0c;对重点海域渔港进行有效监控和管理显得尤为重要。视频监控作为一种高效、实时的管理手段&#xff0c;已成为渔港管理中不可或缺的一部分。当前&#xff0c;我国海域面积广阔&#xff0c;渔港众多&#xf…

QT CNA上位机报错 解决方案

QT编译报错: -lControlCAN 解决方案 更换三个文件&#xff0c;即可解决(QT 自带的是32位库&#xff0c;应使用64位库文件)

docker desktop历史版本安装

1.安装choco Windows安装 choco包管理工具-CSDN博客 2.通过choco安装 下面例子为安装旧版2.3.0.2,其它版本类似 Chocolatey Software | Docker Desktop 2.3.0.2 https://download.docker.com/win/stable/45183/Docker%20Desktop%20Installer.exe choco install docker-des…

【postgresql】pg_dump备份数据库

pg_dump 介绍 pg_dump 是一个用于备份 PostgreSQL 数据库的实用工具。它可以将数据库的内容导出为一个 SQL 脚本文件或其他格式的文件&#xff0c;以便在需要时进行恢复或迁移。 基本用法 pg_dump [选项] [数据库名] 命令选项 -h 或 --host&#xff1a;指定数据库服务器的主…

跟着操作,解决iPhone怎么清理内存难题

在如今智能手机功能日益强大的时代&#xff0c;我们使用手机拍照、录制视频、下载应用、存储文件等操作都会占用手机内存。当内存空间不足时&#xff0c;手机运行会变得缓慢&#xff0c;甚至出现卡顿、闪退等现象。因此&#xff0c;定期清理iPhone内存是非常必要的。那么&#…