django登录注册案例(上) - 详解

news/2025/9/17 20:45:22/文章来源:https://www.cnblogs.com/lxjshuju/p/19097507

创建项目并完成初始配置

settings.py中,配置templates和static

TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR,'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]

在models.py中

from django.db import models
from datetime import datetime
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=16) #用户名
password = models.CharField(max_length=255) #密码
is_delete = models.BooleanField(default=False) #逻辑删除字段
create_time = models.DateTimeField(auto_now=datetime.now()) #注册时间

然后终端执行迁移命令

 python manage.py makemigrations
python manage.py migrate

navicat连接sqlite数据库

说明创建成功

然后在templates下面创建一个user文件夹,然后创建一个register.html

注册
{% csrf_token %}
用户名:
密码:
再次输入密码:

views.py且对存入数据库中的密码进行哈希加密

from django.shortcuts import render
from django.http import JsonResponse
import re
import hashlib
from .models import User
# Create your views here.
def index(request):
return render(request,'index.html')
def register(request):
if request.method == "GET":
return render(request,'user/register.html')
elif request.method == "POST":
#注册
username = request.POST.get("username")
pwd = request.POST.get("pwd")
cpwd = request.POST.get("cpwd")
#用户名不能重复
is_exi = User.objects.filter(username=username).first()
if is_exi:
return JsonResponse({'code': -1, 'msg': "名字已存在,请另外取一个靓号!!"})
if not all([username,pwd,cpwd]):
return JsonResponse({'code': -1, 'msg': "有必填项未填写!!"})
if pwd != cpwd:
return JsonResponse({'code': -1, 'msg': "两次密码输入不一致!!"})
if username.isdigit():
return JsonResponse({'code':-1,'msg':"账号不能全为数字!!"})
if not (6<=len(username)<=16):
return JsonResponse({'code':-1,'msg':"账号为6-16位字符组成"})
if not re.match('[0-9a-zA-Z]{8,16}',pwd):
return JsonResponse({'code': -1, 'msg': "密码需要8-16位数字或者字母组成"})
#存入数据
u = User()
u.username = username
#todo: 对密码进行hash
s = hashlib.sha1()
s.update(pwd.encode("utf-8"))
sha1_pwd = s.hexdigest()
u.password = sha1_pwd
u.save()
return JsonResponse({'code': 200, 'msg': "注册成功"})

配置路由

url(r'^register/',register),

运行

查看数据库

 但是我们发现,使用submit点击提交会mor刷新页面,所以在这里我们用return false就会阻止默认行为,并触发前端Ajax请求。

要使用Ajax请求,首先得导入

所以修改register.py

注册
{% csrf_token %}
用户名:
密码:
再次输入密码:
{#     #}{# submit 默认会刷新页面,return false就会阻止默认行为 #}
$(function () {
// 三个全局变量,表示是否验证通过
is_erro_username = false
is_erro_pwd = false
is_erro_cpwd = false
$("input[name='username']").blur(function () {
check_name()
})
$("input[name='pwd']").blur(function () { // blur表示失去角点的时候触发
check_pwd()
})
$("input[name='cpwd']").blur(function () { // blur表示失去角点的时候触发
check_cpwd()
})
function check_name() {
// blur表示失去角点的时候触发
user = $("input[name='username']").val()
{#console.log('用户名失去焦点', user)#}
if (user == "") { // 如果用户名为空
$("input[name='username']").next().html('用户名不能为空').show()
is_erro_username = false // 表示验证不通过
} else if (user.length  16) {
$("input[name='username']").next().html('用户名为6-16位').show()
is_erro_username = false // 表示验证不通过
} else { // 用户名不为空
reg = /[0-9a-zA-Z]{6,16}/;
if (reg.test(user)) { //正则能匹配,账号正确,隐藏提示
$("input[name='username']").next().hide()
is_erro_username = true // 表示验证通过
} else { // 账号错误
$("input[name='username']").next().html('账号为6-16位字符组成').show()
is_erro_username = false // 表示验证不通过
}
}
}
function check_pwd() {
user = $("input[name='pwd']").val()
if (user == "") { // 如果密码为空
$("input[name='pwd']").next().html('密码不能为空').show()
is_erro_pwd = false // 表示验证不通过
} else if (user.length  16) {
$("input[name='pwd']").next().html('密码为8-16位').show()
is_erro_pwd = false // 表示验证不通过
} else { // 密码不为空
reg = /[0-9a-zA-Z]{8,16}/;
if (reg.test(user)) { //正则能匹配,账号正确,隐藏提示
$("input[name='pwd']").next().hide()
is_erro_pwd = true // 表示验证通过
} else { // 账号错误
$("input[name='pwd']").next().html('密码为8-16位字符组成').show()
is_erro_pwd = false // 表示验证不通过
}
}
}
function check_cpwd() {
{#console.log('确认密码失去焦点')#}
pwd = $("input[name='pwd']").val()
cpwd = $("input[name='cpwd']").val()
if (pwd !== cpwd) {
$("input[name='cpwd']").next().html('两次输入密码不一致').show()
is_erro_cpwd = false
} else {
$("input[name='cpwd']").next().hide()
is_erro_cpwd = true
}
}
$(':submit').click(function () {
// console.log('点击了注册按钮')
// 再次确认一下三个参数验证通过
check_name();
check_pwd();
check_cpwd();
console.log(is_erro_username, is_erro_cpwd, is_erro_pwd)
if (is_erro_username && is_erro_cpwd && is_erro_pwd) { //都验证通过
var username = $("input[name='username']").val()
var pwd = $("input[name='pwd']").val()
var cpwd = $("input[name='cpwd']").val()
var csrf = $("input[name='csrfmiddlewaretoken']").val();
// 发送ajax请求
$.ajax({
url: '/register/',
data: {'username': username, 'pwd': pwd, 'cpwd': cpwd, 'csrfmiddlewaretoken': csrf},
type: 'post',
success: function (res) {
console.log(res)
if (res.code == 200){
$(this).next().hide()
//注册成功,跳转到主页
window.location.href = '/'
}else{
// 注册失败
$("#yangtuo").html(res.msg).show()
}
}
})
} else {  // 至少有一个验证不通过
console.log('至少有一个验证不通过')
return false
}
})
})

并创建一个主页index.html

主页
欢迎您~
欢迎来到平平的课堂!
注册
登录

刷新

注册成功则跳转首页

输入:

跳转:

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

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

相关文章

实用指南:C++ 类型衰变(Type Decay)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

从C++开始的编程生活(10)——string类核心语法和auto自动推导类型

从C++开始的编程生活(10)——string类核心语法和auto自动推导类型pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…

深入解析:Python的输出缓冲区机制

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

某交互题选讲的补题记录

CF750F New Year and Finding Roots 考虑第一步只能随机找点,找完点之后除非找到叶子或者根,不然完全等于啥都不知道。 于是找叶子节点,从这个点的两个邻边往下一直走一定能走到叶子,那么此时这条链的中点的父亲就…

openwrt ipv6 NAT6配置

在诸如校园网或者其他需要认证的网络条件下,由于实名制上网的要求,通常不支持DHCP6-PD,因此要使用IPV6需要使用NAT6目前最新版本的官方openwrt(23.05)已经自动支持NAT6了(firewall.xxx.masq6),因此,如果需要开启…

奶龙抽象语录

奶龙の无上恩情!!!开坑于 $ 2025-9-15 $ 最后更新于 $ 2025-9-17 $上课 班会 我们为什么要规范普通话,不就跟当年秦始皇车同文,书同轨一样吗? —— 25-9-16 其他 我们班五十几号人,我也不要求别的,声音比\(11\…

解题报告-P11670 [USACO25JAN] Cow Checkups S

P11670 [USACO25JAN] Cow Checkups S 题目描述 Farmer John 的 \(N\)(\(1 \leq N \leq 5 \cdot 10^5\))头奶牛站成一行,奶牛 \(1\) 在队伍的最前面,奶牛 \(N\) 在队伍的最后面。FJ 的奶牛也有许多不同的品种。他用从 \(1\) 到 \(N\) 的整数来表示每一品种。队伍从前到后第 …

word vba 对 带编号格式的PO单 段落下添加对应的图片

Attribute VB_Name = "APO_PathStaging" Option Explicit Configuration Constants Private Const BASE_FOLDER As String = "\\10.0.0.10\部门共享\PO\" Private Const START_PARA As Long = 582 Private Const PATH_TAG As String = "[IMG] " …

解题报告-P11671 [USACO25JAN] Farmer Johns Favorite Operation S

P11671 [USACO25JAN] Farmer Johns Favorite Operation S 题目描述 又是 Farmer John 的农场上寒冷而无聊的一天。为了打发时间,Farmer John 发明了一种关于在整数数组上进行操作的有趣的休闲活动。 Farmer John 有一…

详细介绍:javascript文本长度检测与自动截取,用于标题长度检测

详细介绍:javascript文本长度检测与自动截取,用于标题长度检测2025-09-17 20:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

解码C语言运算符

算术运算符运算符 描述 示例 结果+ 加法 5 + 3 8- 减法 5 - 3 2* 乘法 5 * 3 15/ 除法 5 / 2 2% 取模 5 % 2 1++ 自增 a++ a+1-- 自减 a-- a-1注意:整数除法会截断小数部分 取模运算只能用于整数类型关系运算符运算符…

完整教程:一篇读懂Pormise!!【前端ES6】

完整教程:一篇读懂Pormise!!【前端ES6】2025-09-17 20:13 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

93. 递归实现组合型枚举

93. 递归实现组合型枚举 if (sum + n - u < m) return; 如果当前记录的数据 加上 后面的所有可以被选的数据 时无法达到要求时终止 state记录了哪些数据被选,哪些没被选的 state | 1 << u 选择当前的数据,比如0101 -> 10101 #include <iostream> using n…

Sort方法学习(伪代码记录)

Sort 方法总结 selectionSort(vector& a) 核心思想:选择最大/小的数移到最前/后 // 1. 计算数组长度// 2. 控制已排序部分的边界 for(i=0; i<n; i++){// 3. 在未排序部分(j到末尾)中寻找真正的maxfor(j=i+1, j<n; j++) find(max);// 3. 将最大的数放至数组头swap(…

深入解析:【每日一问】运算放大器与比较器有什么区别?

深入解析:【每日一问】运算放大器与比较器有什么区别?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…

9.17支配对问题专题总结

概括 每次查询一定范围内的点组成的点对中的最优值,而通过一些分析去减少有用点对的数量,这样子的有用点对称为 支配对 T1策略是将 \(a_i\) 相同的序列取出来单独考虑 固定 \(b_i<b_j,i<j\) 然后考虑能找出来一个序列 \(i,j1,j2,j3...\) 但是发现选 \(i,j2\) 不如选 \(…

Xじゃないか

並行じゃないか いや 通信じゃないか わかりあえなくて 愛じゃないか ——絡みなんです それがAIなんです。\[\newcommand{\c}{\mathcal} \newcommand{\eps}{\epsilon} \newcommand{\co}[2]{{\color{#1}{#2}}} \]L…

开源收银体系_大型收银系统源码_OctShop

开源收银体系_大型收银系统源码_OctShoppre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

完整教程:热力图是什么?三分钟学会热力图数据分析怎么做!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

机器视觉检测中光源的作用以及分类 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …