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

news2024/11/17 11:50:19

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

1,先创建一个Django项目

django-admin startproject mysite

将创建一个目录,其布局如下:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

2,再创建一个Django应用

python manage.py startapp study_system

将创建一个目录,其布局如下:study_system

study_system/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.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 models

class 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:
            # 设置 session
            self.request.session['username'] = username
            self.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 user
        except 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'] = username

    template_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 LoginView

app_name = 'study_system'

urlpatterns = [
    # 登录注册首页url
    path('', 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, include

urlpatterns = [
    path("study_system/", include("study_system.urls")),    # 应用urls
    path('admin/', admin.site.urls),    # admin后台管理 urls
]

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

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

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

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

相关文章

实时监视分析 IIS 日志

Microsoft IIS服务器&#xff0c;无论是Web还是FTP&#xff0c;对于企业来说都是必不可少的。但是&#xff0c;IT 安全管理员的工作并不止于部署 IIS 服务器&#xff0c;部署后&#xff0c;管理员必须采取安全措施来保护这些服务器&#xff0c;监视 IIS 服务器安全性的一种行之…

免杀对抗-反沙盒+反调试

反VT-沙盒检测-Go&Python 介绍&#xff1a; 近年来&#xff0c;各类恶意软件层出不穷&#xff0c;反病毒软件也更新了各种检测方案以提高检率。 其中比较有效的方案是动态沙箱检测技术&#xff0c;即通过在沙箱中运行程序并观察程序行为来判断程序是否为恶意程序。简单来说…

ubuntu 设置x11vnc服务

Ubuntu 18.04 设置x11vnc服务 自带的vino-server也可以用但是不好用&#xff0c;在ubuntu论坛上看见推荐的x11vnc&#xff08;ubuntu关于vnc的帮助页面&#xff09;&#xff0c;使用设置一下&#xff0c;结果发现有一些坑需要填&#xff0c;所以写下来方便下次使用 转载请说明…

<el-input> textarea文本域显示滚动条(超过高度就自动显示)+ <el-input >不能正常输入,输入了也不能删除的问题

需求&#xff1a;首先是给定高度&#xff0c;输入文本框要自适应这个高度。文本超出高度就会显示滚动条否则不显示。 <el-row class"textarea-row"><el-col :span"3" class"first-row-title">天气</el-col><el-col :span&…

外卖小程序源码vs定制开发:何时选择哪种方式?

在数字餐饮行业的蓬勃发展中&#xff0c;外卖应用程序已经成为餐厅和创业者的必备工具。然而&#xff0c;当涉及到开发外卖应用程序时&#xff0c;您会面临一个重要的决策&#xff1a;是使用外卖小程序源码还是进行定制开发&#xff1f;这两种方法各有优势和劣势&#xff0c;取…

这款可视化拖拽式低代码平台,真香!

目录 一、产品介绍 二、设计原理 三、界面展示 1、代码生成器 2、工作流程 3、门户设计 4、大屏设计 5、报表设计 6、第三方登录 7、多租户实现 8、分布式调度 9、消息中心 四、功能框架 我们在低代码领域探索了很多年&#xff0c;从2014 开始研发低代码前端渲染&#xff0c;从…

DRM全解析 —— CRTC详解(1)

本文参考以下博文&#xff1a; Linux内核4.14版本——drm框架分析(4)——crtc分析 特此致谢&#xff01; 1. 简介 CRTC实际上可以拆分为CRTC。CRT的中文意思是阴极摄像管&#xff0c;就是当初老电视上普遍使用的显像管&#xff08;老电视之所以都很厚&#xff0c;就是因为它…

初学者如何选择:前端开发还是后端开发?

#开发做前端好还是后端好【话题征文】# 作为一名有多年开发经验的过来人&#xff0c;我认为前端开发和后端开发都有其独特的魅力和挑战。下面我将就我的个人经历和观点来分享一些关于前端开发和后端开发的看法。 首先&#xff0c;让我们将编程世界的大城市比作前端开发和后端开…

微信小程序获取用户头像调整

微信小程序获取用户头像&#xff0c;由于用户隐私策略调整&#xff0c;腾讯对获取用户信息也进行了调整。 记录内容如下&#xff1a; 1 新方式 新的方式&#xff1a;当触发获取用户头像时&#xff0c;由用户选择头像图片&#xff0c;输入昵称。 具体代码如下&#xff0c;即&…

Mybatis-plus 使用

1. 注解使用 mybatis-plus提供了 TableName, TableId, TableField, TableLogic 四种注解&#xff0c;其含义分别为&#xff1a; TableName TableName("SPF_Require_Vehicle") 用于声明当前class所对应数据库中的表&#xff0c;如果class的名字和表的名字完全相同&…

基于SSM的宿舍管理系统(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的宿舍管理系统&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc My…

面试高频手撕算法 - 背包问题2

目录 1. 完全背包 1.1 【模板】完全背包 1.2 零钱兑换 1.3 零钱兑换 II 1.4 完全平方数 2. 二维费用的背包问题 2.1 一和零 2.2 盈利计划 --- 如果背包问题原先没有基础的&#xff0c;建议先看上一篇博客 --- 面试高频手撕算法 - 01背包系列 1. 完全背包 1.1 【模板】…

天眼销|企业数据查询必备

首先&#xff0c;得介绍一下天眼销是一个什么样的平台&#xff0c;请往下看&#xff1a; 可能会有一些还是觉得懒得看&#xff0c;简单理解&#xff0c;它与我们熟知的某查查&#xff0c;天眼某相类似&#xff0c;有很多共同之处。比如&#xff1a;某查查的服务模式&#xff08…

数据结构与算法(七)--使用链表实现栈

一、前言 之前我们已经学习了链表的所有操作及其时间复杂度分析&#xff0c;我们可以了解到对于链表头的相关操作基本都是O(1)的&#xff0c;例如链表头增加、删除元素&#xff0c;查询元素等等。那我们其实有一个数据结构其实可以完美利用到这些操作的特点&#xff0c;都是在…

Idea升级版本后踩坑关于Local History

版本升级&#xff1a;IntelliJ IDEA 2022.1.2 (Ultimate Edition) Local History本地历史修改记录在idea升级后默认只保留 5天 以内的修改记录&#xff0c;导致时间过长的一些内容就自动被清除掉了。可通过File->Setting-Advanced Setting 进行修改。

数据结构——常见的十种排序算法

一、常见的十种排序算法&#xff1a; 冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序 1.【知识框架】 补充&#xff1a; 内部排序&#xff1a;整个排序过程完全在内存中进行。 外部排序&#xff1a;由于待排序记录数据量太…

python进行接口自动化测试

一、接口自动化测试的流程 1、需求分析 1、1请求&#xff08;url,方法、数据&#xff09; 2、挑选需要做自动化测试的接口 3、设计自动化测试用例 4、搭建自动化测试环境 5、设计自动化执行框架&#xff08;报告、参数化、 用例执行框架&#xff09; 6、编写代码 7、执…

工程派工单,建筑工程派工单

工程派工单是指建设项目管理人员或工程维修人员发出的文件&#xff0c;用于标明工人或维修人员在建设项目或设备中处理或维修问题的任务。派工单包括建设项目的实际维护任务、所需材料、工具等信息&#xff0c;以及具体的执行人员和完成时间。工程派工单是保证建设项目顺利开展…

用《斗破苍穹》的视角打开C#3 标签与反射(人物创建与斗技使用)

随着剧情的发展&#xff0c;主线人物登场得越来越多&#xff0c;时不时跳出一个大佬&#xff0c;对我张牙舞爪地攻击。眼花缭乱的斗技让我不厌其烦&#xff0c;一个不小心&#xff0c;我就记不清楚在哪里遇上过什么人&#xff0c;他会什么斗技了。这时候&#xff0c;我就特别希…

Centos中清除因程序异常终止,导致的残留的Cache/buff_drop_caches命令---linux工作笔记063

我这里因为nifi程序背压设置的不合理,导致,内存和CPU消耗过高,系统崩溃,但是重启NIFI以后,发现 对应的执行top命令,看到,系统的buff/cache 依然没有减少,说明内存被浪费了,残留在这里没有被回收. 用这个办法执行这个命令; linux会自动触发清理,但是只有在内存不够用的时候才会…