当前位置: 首页 > news >正文

Django实战项目-学习任务系统-用户登录

第一步:先创建一个Django应用程序框架代码

1,先创建一个Django项目

django-admin startproject mysite将创建一个目录,其布局如下:mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.py

2,再创建一个Django应用

python manage.py startapp study_system将创建一个目录,其布局如下:study_systemstudy_system/__init__.pyadmin.pyapps.pymigrations/__init__.pymodels.pytests.pyviews.py详情操作参考《编写你的第一个 Django 应用程序》相关文章。
https://mp.weixin.qq.com/s?__biz=Mzg2NDk2MTY3OA==&mid=2247483730&idx=1&sn=0cab44a659067ad145f55a2553c25f4e&chksm=ce6014b3f9179da5b4cf08d43fc13819d2941c7287b234b99beb3722a29e7b863df62e2bbf97&token=737388&lang=zh_CN#rd 

 

第二步:编写第一个功能-用户登录

1,数据库设置
修改 settings.py 配置信息,采用mysql数据库
文件目录结构:
./mysite/mysite/settings.py

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'world',"USER": "root","PASSWORD": "123456","HOST": "127.0.0.1","PORT": "3306","OPTIONS": {"init_command": "SET default_storage_engine=INNODB", },}
}

 

2,创建模型

编辑模型文件:
./mysite/study_system/models.py

from django.db import modelsclass StudyUser(models.Model):user_id = models.AutoField(primary_key=True, verbose_name='用户ID')username = models.CharField(max_length=50, verbose_name='用户名')password = models.CharField(max_length=50, verbose_name='密码')email = models.EmailField(max_length=100, verbose_name='邮箱')phone_num = models.CharField(max_length=20, verbose_name='手机号码')role = models.IntegerField(verbose_name='角色', choices=((1, '系统管理员'), (2, '辅导员'), (3, '学生')))parent_id = models.IntegerField(verbose_name='辅导员用户ID', null=False)created_time = models.DateTimeField(verbose_name='创建时间')update_time = models.DateTimeField(verbose_name='更新时间')class Meta:verbose_name = '学习用户表'verbose_name_plural = '学习用户表'# 用于模型的数据库表的名称db_table = "study_users"


3,激活模型

3.1. 修改 settings.py 配置信息:
./mysite/mysite/settings.py

INSTALLED_APPS = ["study_system.apps.StudySystemConfig", #添加的应用'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
]


3.2. 运行 makemigrations 命令(记得进入 manage.py 所在目录):
$ python manage.py makemigrations study_system

生成如下文件:
./mysite/study_system/migrations/0001_initial.py

3.3. 再运行 sqlmigrate 命令(记得进入 manage.py 所在目录):
sqlmigrate 命令采用迁移名称并返回其模型建表SQL语句:
$ python manage.py sqlmigrate study_system 0001

3.4. 最后再运行 migrate 命令(记得进入 manage.py 所在目录):
$ python manage.py migrate
实现在数据库中创建这些模型表结构。


4,编写用户登录视图

4.1. 编辑视图代码:
./mysite/study_system/views.py

# 登录首页视图
def index(request):context = {}return render(request, "study_system/index.html", context)# 通用视图模型,FormView , 表单视图
class LoginView(FormView):template_name = 'study_system/index.html'form_class = LoginForm# 设置成功登录后的重定向URL# success_url = 'home/'success_url = reverse_lazy('study_system:home')  # 修改为完整的 URL# 登录表单校验def form_valid(self, form):username = form.cleaned_data['username']password = form.cleaned_data['password']# 内置用户权限认证方法,不管用# user = authenticate(username=username, password=password)user = self.validate_user(username, password)if user:# 设置 sessionself.request.session['username'] = usernameself.request.session['role'] = user.role'''在登录视图类中,当用户通过验证并且认证成功时,调用 super().form_valid(form) 方法会触发 Django 的默认行为,其中包括登录用户并将登录状态信息与请求相关联。这样,request.user 对象将被设置为已认证的用户,并且 request.user.is_authenticated 将返回 True。'''return super().form_valid(form)else:return self.render_to_response(self.get_context_data(form=form, error_message='用户或密码不匹配,登录失败.'))# 校验用户密码是否存在def validate_user(self, username, password):try:# 根据用户名和密码查询用户user = StudyUser.objects.get(username=username, password=password)# print('根据用户名和密码查询用户:'+str(user))return userexcept StudyUser.DoesNotExist:return None# 登录成功主页视图
def home(request):# 响应容器rsp_dict = {}# 获取当前用户名username = request.session.get('username')# 根据用户名获取用户对象cur_user = StudyUser.objects.get(username=username)print('根据用户名查询用户对象:' + str(cur_user))# print('session : '+str(username))rsp_dict['username'] = usernametemplate_name = "study_system/home.html"return render(request, template_name, rsp_dict)


4.2. 编辑表单验证代码:
./mysite/study_system/forms.py

from django import forms# 登录用户表单验证
class LoginForm(forms.Form):username = forms.CharField(max_length=100)password = forms.CharField(widget=forms.PasswordInput)


4.3. 编辑页面模板代码:

4.3.1. 网站首页登录页面
./mysite/study_system/templates/study_system/index.html

<!DOCTYPE html>
<html>
<head>{#    让网页自动适应PC端和移动端#}<meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge">{#    viewport是view portion的意思,用汉语说,就是“可见区域“。所以这个标签是在定义可见区域的规则。#}{#    width=device-width的意思是”宽度自动适配设备屏幕宽度"#}{#    inital-scale=1.0的意思是“宽度默认为设备屏幕的宽度”。#}<meta name="viewport" content="width=device-width, initial-scale=1.0"><title>study system</title><link rel="stylesheet" href="/static/study_system/bootstrap3/css/bootstrap.min.css">{#    让网页自动适应PC端和移动端#}<style>.container {max-width: 400px;margin: 0 auto;padding-top: 100px;}</style>
</head>
<body><div class="container"><h1 class="text-center">study system</h1><form method="post" action="{% url 'study_system:login' %}">{% csrf_token %}{#        在Django中提交数据到后端服务的时候,为了安全,要使用CSRF(跨站请求伪造)。#}{#        跨站请求伪造的问题在于,服务器信任来自客户端的数据。#}{#        常规的做法是在template模板HTML文件中的form表单 中添加 {% csrf_token %} 可以实现安全提交。#}{#        当我们使用from表单标签来发送请求时,如果需要csrftoken认证,那么必须将它写到我们的form表单标签里面,里面的任意位置。#}{#        生成的隐藏标签为:#}{#        <input type="hidden" name="csrfmiddlewaretoken" value="WVHKQeAuMS4RGqyLybryIBAfacDa1Dp7PEaB3Badv3y0fvLqydX36xAVen6z3oS4">#}<div class="form-group"><input type="text" class="form-control" id="username" name="username" placeholder="username"></div><div class="form-group"><input type="password" class="form-control" id="password" name="password" placeholder="password"></div><div class="form-group"><button type="submit" class="form-control btn-primary">登录账号</button></div><div class="form-group"><a href="{% url 'study_system:register' %}" class="form-control btn-link text-right">注册账户</a></div><!-- 在 body 标签中添加一个隐藏的弹框 --><div class="form-group" id="errorModal" style="display: none;"><p id="alert" class="alert alert-warning">{{ error_message }}</p></div></form>
</div><script src="/static/study_system/jquery1.3.3/jquery.min.js"></script><!-- 在登录页面的合适位置调用弹框 -->
{% if error_message %}<script>$(document).ready(function () {// 设置错误消息内容$("#alert").text("{{ error_message }}");// 显示弹框$("#errorModal").show();});</script>
{% endif %}
</body>
</html>

4.3.2. 网站登录成功用户主页面
./mysite/study_system/templates/study_system/home.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>study system</title><script src="/static/study_system/jquery1.3.3/jquery.min.js"></script><link rel="stylesheet" href="/static/study_system/bootstrap3/css/bootstrap.min.css"><style type="text/css">.content_html {width: 100%;height: auto;margin: 0.2em auto 0.2em auto;border: 0.1em solid #68FE61;}</style>
</head>
<body>
<div>{% include "study_system/common/head.html" %}<div class="content_html">主内容区域</div>
</div>
</body>

4.3.3. 网站登录成功用户菜单页面
./mysite/study_system/templates/study_system/common/head.html

<div><!-- 头部logo区 --><div align="center"><a href="/study_system/home/">study system</a></div><!-- 头部菜单区 -->{#两端对齐的导航元素#}<ul class="nav nav-pills nav-justified"><li class="menu-head"><a href="#">任务管理</a></li><li class="menu-head"><a href="#">定时任务管理</a></li><li class="menu-head"><a href="#">兑换物品管理</a></li><li class="menu-head"><a href="#">用户管理</a></li><li class="menu-head"><a href="#"><strong>欢迎: {{ request.session.username }}</strong> 退出</a></li></ul>
</div>

4.4. 编辑应用 urls 配置代码:
./mysite/study_system/urls.py

from django.urls import path
from . import views
from .views import LoginViewapp_name = 'study_system'urlpatterns = [# 登录注册首页urlpath('', views.index, name='index'),path('login/', LoginView.as_view(), name='login'),path('home/', views.home, name='home'),
]


4.5. 编辑项目 urls 配置代码:
./mysite/mysite/urls.py

from django.contrib import admin
from django.urls import path, includeurlpatterns = [path("study_system/", include("study_system.urls")),    # 应用urlspath('admin/', admin.site.urls),    # admin后台管理 urls
]

第三步:运行测试-用户登录功能

 -------------------------------------------------------------end -------------------------------------------------------------

相关文章:

Django实战项目-学习任务系统-用户登录

第一步&#xff1a;先创建一个Django应用程序框架代码 1&#xff0c;先创建一个Django项目 django-admin startproject mysite将创建一个目录&#xff0c;其布局如下&#xff1a;mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.py 2&#xff0c;再创建一个…...

【动手学深度学习-Pytorch版】Transformer代码总结

本文是纯纯的撸代码讲解&#xff0c;没有任何Transformer的基础内容~ 是从0榨干Transformer代码系列&#xff0c;借用的是李沐老师上课时讲解的代码。 本文是根据每个模块的实现过程来进行讲解的。如果您想获取关于Transformer具体的实现细节&#xff08;不含代码&#xff09;可…...

做外贸独立站选Shopify还是WordPress?

现在确实会有很多新人想做独立站&#xff0c;毕竟跨境电商平台内卷严重&#xff0c;平台规则限制不断升级&#xff0c;脱离平台“绑架”布局独立站&#xff0c;才能获得更多流量、订单、塑造品牌价值。然而&#xff0c;在选择建立外贸独立站的过程中&#xff0c;选择适合的建站…...

echarts的bug,在series里写tooltip,不起作用,要在全局先写tooltip:{}才起作用,如果在series里写的不起作用就写到全局里

echarts的bug&#xff0c;在series里写tooltip&#xff0c;不起作用&#xff0c;要在全局先写tooltip&#xff1a;{show:true}才起作用&#xff0c;如果在series里写的不起作用就写到全局里 series里写tooltip不起作用&#xff0c;鼠标悬浮在echarts图表上时不显示提示 你需要…...

jmeter分布式压测

一、什么是压力测试&#xff1f; 压力测试&#xff08;Stress Test&#xff09;&#xff0c;也称为强度测试、负载测试&#xff0c;属于性能测试的范畴。 压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷&#xff0c;长时间或超大负荷地运行被测软件系统&#xff…...

consulmanage部署

一、部署consul 使用yum方式部署consul yum install -y yum-utils yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo yum -y install consul 执行以下命令获取uuid密钥并记录下来 uuidgen 编辑consul配置文件 vi /etc/consul.d/consul.h…...

大数据软件项目的验收流程

大数据软件项目的验收流程是确保项目交付符合预期需求和质量标准的关键步骤。以下是一般的大数据软件项目验收流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.项目验收计划制定&#xff1a; 在…...

《第一行代码Andorid》阅读笔记-第一章

这篇文章是我自己的《第一行代码Andorid》的阅读笔记&#xff0c;虽然大量参考了别人已经写好的一些笔记和代码但是也有自己的提炼和新的问题在里面&#xff0c;我也会放上参考文章链接。 学习重点 Android系统的四大组件&#xff1a; &#xff08;1&#xff09;活动&#xff…...

Educational Codeforces Round 146 (Rated for Div. 2)(VP)

写个题解 A. Coins void solve(){ll n, k; cin >> n >> k;bl ok true;if (n &1 && k %2 0) ok false;print(ok ? yes : no); } B. Long Legs void solve(){db x, y; cin >> x >> y;if (x < y) swap(x, y);int t1 ceil(sqrt(x))…...

9.30国庆

消息队列完成进程间通信 #include <myhead.h>#define size sizeof(msg_ds)-sizeof(long) //正文大小//消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }msg_ds;//创建子线程构造体 void *task1(void *arg) {//创造第二个key值ke…...

java基础-第4章-面向对象(二)

一、static关键字 静态&#xff08;static&#xff09;可以修饰属性和方法。 称为静态属性&#xff08;类属性&#xff09;、静态方法&#xff08;类方法&#xff09;。 静态成员是全类所有对象共享的成员。 在全类中只有一份&#xff0c;不因创建多个对象而产生多份。 不必创…...

flex加 grid 布局笔记

<style> .flex-container { display: flex; height: 100%; /* 设置容器的高度 */ } .wide { display: flex; padding: 10px; border: 1px solid lightgray; text-align: center; justify-content: …...

最高评级!华为云CodeArts Board获信通院软件研发效能度量平台先进级认证

9月26日&#xff0c;华为云CodeArts Board获得了中国信通院《云上软件研发效能度量分级模型》的先进级最高级评估&#xff0c;达到了软件研发效能度量平台评估的通用效能度量能力、组织效能模型、项目效能模型、资源效能模型、个人效能模型、研发效能评价模型、项目管理域、开发…...

图像上传功能实现

一、后端 文件存放在images.path路径下 package com.like.common;import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annot…...

03_Node.js模块化开发

1 Node.js的基本使用 1.1 NPM nodejs安装完成后&#xff0c;会跟随着自动安装另外一个工具npm。 NPM的全称是Node Package Manager&#xff0c;是一个NodeJS包管理和分发工具&#xff0c;已经成为了非官方的发布Node模块&#xff08;包&#xff09;的标准。 2020年3月17日&…...

Nginx支持SNI证书,已经ssl_server_name的使用

整理了一些网上的资料&#xff0c;这里记录一下&#xff0c;供大家参考 什么是SNI&#xff1f; 传统的应用场景中&#xff0c;一台服务器对应一个IP地址&#xff0c;一个域名&#xff0c;使用一张包含了域名信息的证书。随着云计算技术的普及&#xff0c;在云中的虚拟机有了一…...

Hive【Hive(六)窗口函数】

窗口函数&#xff08;window functions&#xff09; 概述 定义 窗口函数能够为每行数据划分 一个窗口&#xff0c;然后对窗口范围内的数据进行计算&#xff0c;最后将计算结果返回给该行数据。 语法 窗口函数的语法主要包括 窗口 和 函数 两个部分。其中窗口用于定义计算范围…...

Met no ‘TRANSLATIONS’ entry in project

这里写自定义目录标题 问题描述&#xff1a;解决方法&#xff1a; 问题描述&#xff1a; 多工程项目&#xff0c;执行完update Translation生成了.ts文件&#xff0c;也用翻译工具翻译完了&#xff0c;执行release时&#xff0c;报错“Met no ‘TRANSLATIONS’ entry in proje…...

Leetcode901-股票价格跨度

一、前言 本题基于leetcode901股票价格趋势这道题&#xff0c;说一下通过java解决的一些方法。并且解释一下笔者写这道题之前的想法和一些自己遇到的错误。需要注意的是&#xff0c;该题最多调用 next 方法 10^4 次,一般出现该提示说明需要注意时间复杂度。 二、解决思路 ①…...

“传统文化宣传片+虚拟人动捕设备”前景如何?

在数字化时代的发展下&#xff0c;动捕设备的加入&#xff0c;让传播传统文化的虚拟人更具生动表现&#xff0c;拉近人们与传统文化的距离&#xff0c;通过虚拟人动作捕捉动画宣传片&#xff0c;引起更多人对传统文化的关注与传承。 *图片源于网络 深圳文博会创意短片《嗨ICIF…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...