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 models

class 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'  # 属于那个app
        verbose_name = '用户'
        verbose_name_plural = verbose_name

    # 输出对象时用到的
    def __str__(self):
        return self.username
2、forms.py
from django import forms
from .models import User


class 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():
            # 设置session
            request.session['username'] = request.POST['username']
            return redirect('app:index')
        return render(request, 'login.html', {'form': form})


# 注销
def Logout(request):
    request.session.clear()  # 清除session
    return 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, include

urlpatterns = [
    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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】希尔排序:基于插入排序的高效排序算法

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 二、基本原理 三、实现步骤 四、C语言实现 五、性能分析 1. 时间复杂度…

Hadoop3:HDFS-查看logs文件,排查NameNode故障原因。

问题一、NameNode进程退出 我们发现&#xff0c;NameNode进程不存在。 情况1、单独启动NameNode hdfs --daemon start namenode能够正常拉起&#xff0c;那就没问题 情况2、无法独立启动NameNode 先尝试启动NameNode hdfs --daemon start namenode发现&#xff0c;没能成…

el-date-picker手动输入日期,通过设置开始时间和阶段自动填写结束时间

需求&#xff1a;根据开始时间&#xff0c;通过填写阶段时长&#xff0c;自动填写结束时间&#xff0c;同时开始时间和节数时间可以手动输入 代码如下&#xff1a; <el-form ref"ruleForm2" :rules"rules2" :model"formData" inline label-po…

Redis深度解析:从基础到高级特性,剖析关键技术

一、关于Redis Redis介绍 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统&#xff0c;是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSIC 语言编写、遵守 BSD&#xff08;开源协议&#xff09; 协议、支持网络、可基于内存…

指令判断数据更改,文本变色

默认数据是这样&#xff0c;如果更改了其中一个&#xff0c;文本框变成红色 <el-form-item label"Activity name"><el-inputv-model"form.name"v-highlight"datas[name]"input"changeValue(name)"/></el-form-item>…

excel系列(二) - 利用 easypoi 快速实现 excel 文件导入导出

一、介绍 在上篇文章中&#xff0c;我们介绍了 apache poi 工具实现 excel 文件的导入导出。 本篇我们继续深入介绍另一款优秀的 excel 工具库&#xff1a;easypoi。 二、easypoi 以前的以前&#xff0c;有个大佬程序员&#xff0c;跳到一家公司之后就和业务人员聊上了&…

智慧水利:迈向水资源管理的新时代,结合物联网、云计算等先进技术,阐述智慧水利解决方案在提升水灾害防控能力、优化水资源配置中的关键作用

本文关键词&#xff1a;智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】

文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中&#xff0c;然后在将用户的查询向量化&#xff0c;从向量数据库中召回相似性数据&#xff0c;构造成 context template, 放到 LLM 中进行查询…

HCIE是什么等级的证书?

HCIE&#xff08;华为认证互联网专家&#xff0c;Huawei Certified Internetwork Expert&#xff09;是华为认证体系中的最高等级证书。它要求考生具备在复杂网络环境中规划、设计、部署、运维和优化网络的能力。HCIE认证是华为认证体系中最具挑战性和含金量的认证之一&#xf…

MWA(Modern Web App)初学那些事-2-Basic HTML CSS

初学MWA(Modern Web App&#xff09;那些事-2-Basic HTML & CSS 目录 初学MWA(Modern Web App&#xff09;那些事-2-Basic HTML & CSS前言一、本节学习目标二、HTML基础内容2.1关键元素2.4 Scripts 三、CSS 基础内容3.1 级联样式表-用于设置网页样式和布局3.2 CSS规则语…

cuda缓存示意图

一、定义 cuda 缓存示意图gpu 架构示意图gpu 内存访问示意图 二、实现 cuda 缓存示意图 DRAM: 通常指的是GPU的显存&#xff0c;位于GPU芯片外部&#xff0c;通过某种接口&#xff08;如PCIE&#xff09;与GPU芯片相连。它是GPU访问的主要数据存储区域&#xff0c;用于存储大…

Day53:图论 岛屿数量 岛屿的最大面积

99. 岛屿数量 时间限制&#xff1a;1.000S 空间限制&#xff1a;256MB 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周…

IP地址与物理地址:网络通信的基础详解

在学习网络通信时&#xff0c;理解IP地址与物理地址&#xff08;也称为硬件地址&#xff09;的区别至关重要。这篇文章将为你解答这些基本概念&#xff0c;并帮助你更好地掌握网络通信的基础。 什么是IP地址和物理地址&#xff1f; IP地址是网络层的逻辑地址&#xff0c;用于标…

《书生大模型实战营第3期》入门岛 学习笔记与作业:Linux 基础知识

文章大纲 Linux 系统简介系统简介为啥正儿八经的深度学习都用 Linux&#xff1f; Linux 基础命令3.1 文件管理3.2 进程管理3.3 工具使用 LinuxInternStudio1. InternStudio开发机介绍2. SSH及端口映射2.1 什么是SSH&#xff1f;2.2 如何使用SSH远程连接开发机&#xff1f;2.2.1…

VUE前端HTML静默打印(不弹出打印对话框)PDF简单方案

前言 在做打印功能的时候&#xff0c;以前大部分客户端都是用C#做的&#xff0c;静默打印&#xff08;也就是不弹出打印对话框&#xff09;比较简单。 但是使用浏览器作为客户端&#xff0c;静默打印&#xff08;也就是不弹出打印对话框&#xff09;做起来就比较困难。困难的…

Mac Dock栏多屏幕漂移固定的方式

记录一下 我目前的版本是 14.5 多个屏幕&#xff0c;Dock栏切换的方式&#xff1a; 把鼠标移动到屏幕的中间的下方区域&#xff0c;触到边边之后&#xff0c;继续往下移&#xff0c;就能把Dock栏固定到当前屏幕了。

教学原则及方法

直观性原则 启发性原则 循序渐进性原则 巩固性原则 量力性原则 思想性与科学性相统一原则 理论联系实际原则 因材施教原则

【学习笔记】3GPP支持无人机的关键技术以及场景-3GPP TS 22.125技术报告

目录 引言 1 范围 2 引用 3 定义、符号和缩写 4 UAS概述 5 无人机系统&#xff08;UAS&#xff09;远程识别要求 6 无人机使用要求 引言 这份文件是3GPP TS 22.125 V19.2.0&#xff0c;主要定义了3GPP系统对无人飞行器&#xff08;UAV&#xff09;及其系统&#xff08;U…

决策树(ID3,C4.5,C5.0,CART算法)以及条件推理决策树R语言实现

### 10.2.1 ID3算法基本原理 ### mtcars2 <- within(mtcars[,c(cyl,vs,am,gear)], {am <- factor(am, labels c("automatic", "manual"))vs <- factor(vs, labels c("V", "S"))cyl <- ordered(cyl)gear <- ordered…

神经网络替代密度泛函理论!清华研究组发布通用材料模型 DeepH,实现超精准预测

在材料设计中&#xff0c;了解其电子结构与性质是预测材料性能、发现新材料、优化材料性能的关键。过去&#xff0c;业界广泛使用密度泛函理论 (DFT) 来研究材料电子结构和性质&#xff0c;其实质是将电子密度作为分子&#xff08;原子&#xff09;基态中所有信息的载体&#x…