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

news2024/12/25 15:49:01

创建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>

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

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

相关文章

色彩与故乡的对话 —— 钱华个人油画展正式开展

色彩与故乡的对话 —— 钱华个人油画展正式开展 2024年7月17日 &#xff0c;在宁波这座历史与现代交织的城市里&#xff0c;艺术与文化的碰撞再次绽放出耀眼的光芒。由宁波海曙区美术家协会主办&#xff0c;宁波市海纳广场开发经营有限公司协办的“色彩与故乡的对话——钱华个人…

【SpringBoot Web开发之静态资源访问】笔记

详细内容见官方文档&#xff1a;Static Content SpringBoot Web开发之静态资源访问 1.准备工作&#xff1a;创建WebDemo2.静态资源目录2.1官网原文2.2静态资源目录第一步&#xff1a;依照上面2.1官网原文中创建如下目录第二步&#xff1a;复制粘贴图片到静态资源目录中第三步…

二叉树的前、中、后序遍历(递归法、迭代法)leetcode144/94/145

leetcode144、二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a;…

海外媒体发稿-瑞典SEO破茧成蝶:从0到10的实战精要-大舍传媒

海外媒体发稿-瑞典SEO破茧成蝶:从0到10的实战精要 一、迷茫与意义的探寻 有一天我找了王老师聊天&#xff0c;谈到生活迷茫和人生的意义。老师说了一段话&#xff1a;当全情投入于一件事情时&#xff0c;是没有时间去迷茫或思索人生意义的。我感触很深&#xff0c;当总感到迷…

UI设计中的响应式布局策略:让您的界面在各种设备上都表现出色

UI界面设计它是人与机器之间交互的媒介&#xff0c;也是客户体验的媒介&#xff08;UX&#xff09;一个组成部分。操作界面由两个主要部分组成&#xff1a;视觉设计&#xff08;即传达产品的外观和感觉&#xff09;和交互设计&#xff08;即元素功能和逻辑组织&#xff09;。用…

自定义注解 + Redis 实现业务的幂等性

1.实现幂等性思路 实现幂等性有两种方式&#xff1a; ⭐ 1. 在数据库层面进行幂等性处理&#xff08;数据库添加唯一约束&#xff09;. 例如&#xff1a;新增用户幂等性处理&#xff0c;username 字段可以添加唯一约束. ⭐ 2. 在应用程序层面进行幂等性处理. 而在应用程序…

Go语言并发编程-Channel通信_2

Channel通信 Channel概述 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存 这是Go语言最核心的设计模式之一。 在很多主流的编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存&#xff0c;而Go语言中多Goroutine通信的主要方案是Cha…

人工智能算法工程师(高级)课程1-单类目标识别之人脸检测识别技术MTCNN模型介绍与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(高级)课程1-单类目标识别之人脸检测识别技术MTCNN模型介绍与代码详解。本文深入探讨了基于PyTorch的人脸检测与识别技术&#xff0c;详细介绍了MTCNN模型、Siamese network以及center loss、sof…

趣谈linux操作系统 9 网络系统-读书笔记

文章目录 网络协议栈基础知识回顾网络分层网络分层的目的各层作用简介延伸-ip地址,有类,无类,cidr socket实现分析tcp/udp回顾socket编程回顾TCP编程回顾UDP编程回顾差异 socket相关接口实现浅析sokcet实现解析创建socket的三个参数socket函数定义及其参数创建socket结构体关联…

element UI :el-table横向列内容超出宽度,滚动条不显示问题

是否能解决你问题的前提 **看到这篇文章的解决问题的方案之前&#xff0c;请先回忆你是否在项目中的全局样式或者私有组件中去单独设置过滚动条样式。如果有 请继续往下看&#xff1a;**单独设置过滚动条样式代码实例&#xff1a; ::-webkit-scrollbar {/*滚动条整体样式*/wi…

STM32智能家居电力管理系统教程

目录 引言环境准备智能家居电力管理系统基础代码实现&#xff1a;实现智能家居电力管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;电力管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家居电…

代码随想录——最后一块石头的重量(Leetcode1046)

题目链接 class Solution {public int lastStoneWeight(int[] stones) {int len stones.length;if(len 1){return stones[0];}if(len 2){return Math.abs(stones[0] - stones[1]);}while(true){Arrays.sort(stones);if(stones[len - 2] 0){break;}stones[len - 1] stone…

一维差分的实现

这是C算法基础-基础算法专栏的第十三篇文章&#xff0c;专栏详情请见此处。 引入 上次我们学习了前缀和的实现&#xff0c;它可以快速解决求区间和问题。这次我们要学习差分&#xff0c;它是前缀和的逆运算&#xff0c;可以快速解决对序列的一个区间同时加或减一个数这样的问题…

LabVIEW在CRIO中串口通讯数据异常问题

排查与解决步骤 检查硬件连接&#xff1a; 确保CRIO的串口模块正确连接&#xff0c;并且电缆无损坏。 确认串口模块在CRIO中被正确识别和配置。 验证串口配置&#xff1a; 在LabVIEW项目中&#xff0c;检查CRIO目标下的串口配置&#xff0c;确保波特率、数据位、停止位和校验…

用杰理芯片发不出100hz~1200hz频率的PWM波

思路&#xff1a; 问原厂工程师 回复&#xff1a; 看下是不是数据做除法的时候越界了&#xff0c;如果有用户手册&#xff0c;直接看下那几个定时器的寄存器算下就知道为什么 芯片&#xff1a; AD155A 行动&#xff1a; 相关文档和代码&#xff1a; TMR_PR&#xff1a;1…

云计算安全流程与管控要求的全面解析

华为云安全流程与管控要求的全面解析 引言 在云计算技术迅猛发展的背景下&#xff0c;云安全问题日益凸显其重要性。华为云作为行业的领军企业&#xff0c;其安全流程与管控要求不仅关乎自身的服务稳定性&#xff0c;更直接影响到广大用户的业务安全。本文将深入解析华为云的安…

win注册表怎么打开

注册表怎么打开 在使用Windows电脑时&#xff0c;有时我们可能需要访问注册表&#xff08;Registry Editor&#xff09;&#xff0c;以进行一些高级的系统设置和调整。注册表包含了系统的配置信息和设置选项&#xff0c;因此在操作时需格外小心谨慎。现在&#xff0c;让我来教你…

npm install时报错 reason: certificate has expired

在VS code中导入新项目&#xff0c;执行npm install时报错&#xff1a; npm warn old lockfile Could not fetch metadata for antv/g3.4.10 FetchError: request to https://registry.npm.taobao.org/antv%2fg failed, reason: certificate has expirednpm warn old lockfile …

「C++系列」判断

文章目录 一、判断1. if 语句2. if-else 语句3. if-else if-else 语句链4. switch 语句注意事项 二、应用场景1. 用户输入验证2. 决策逻辑3. 循环控制4. 排序算法 三、相关链接 一、判断 在C中&#xff0c;判断通常是通过条件语句来实现的&#xff0c;这些语句允许程序根据特定…

UDP报文结构详解:一篇文章带你搞懂

大家好呀!我是你们的老朋友小米,一个活泼开朗的29岁技术达人。今天我们来聊聊网络基础中的一个重要概念——UDP报文格式。相信很多小伙伴在学习网络编程或者网络协议时,都接触过UDP这个名词。UDP,全称是User Datagram Protocol(用户数据报协议),是一种无连接的传输层协议…