Django 小实例S1 简易学生选课管理系统 第4节——实现登录页面

点击查看教程总目录

作者自我介绍:b站小UP主时常直播编程+红警三python1对1辅导老师

本文涉及到的新的额外知识点:templateviewurlsforms

没有这部分基础的读者,建议一边阅读本文一边查阅相关知识

这里推荐我的专栏:Django自学笔记 相关章节内容

0 添加用户视图(view)与模板(template)、设置urls

Django 采用了 MVT 的软件设计模式,其中MVT分别指

  • Model(模型) - 负责数据
  • View(视图)- 负责逻辑
  • Template(模板)- 负责前端展示

我们在前面已经实现了模型(model)

这里要实现一个页面,基本套路是

  1. 先完成模板(template) - 前端展示用
  2. 然后实现视图(view) - 后端逻辑
  3. 设置好url - 设置url和view的对应关系

本文就是按照这个顺序来组织代码的

1 主页面

本项目主页面实际是一个选择身份的页面,点击后跳转到具体的身份登录页,整个页面实现起来比较简单

  • A 首先添加模板(template)

    这里由于主页面和登录页面的背景是相同的,所以这两个页面可以使用共同的母版,这里先添加母版

在项目的template文件夹下,新建user文件夹,在其中添加background.html,内容

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
学生选课管理系统
</title>
</head>
<body>
<div class="main-container">
<div class="main-header">
<div class="main-title">学生选课管理系统</div>
<div class="sub-title">Student Course Management System</div>
{% block welcome_message %}
{% endblock %}
</div>
<div class="login-container">
{% block login_container %}
{% endblock %}
</div>
</div>
</body>
</html>

然后再添加login_home.html文件,内容如下

{% extends "user/background.html" %}
{% block login_container %}
<div class="login-kind student-login-button">
<a href="">学生登录</a>
</div>
<div class="login-kind teacher-login-button">
<a href="">教师登录</a>
</div>
{% endblock %}
  • B 添加对应的视图(view)方法

    ./user/views.py中,添加方法
def home(request):
return render(request, "user/login_home.html")
  • C 设置主页的url

新建./user/urls.py代码如下

from user import views
from django.urls import path urlpatterns = [
path('login/', views.home, name="login"),
]

./SSCMS/urls.py中添加user模块的urls,

修改后的./SSCMS/urls.py代码如下(原来的注释建议保留,不保留也无所谓)

from django.urls import path, include

urlpatterns = [
path('user/', include("user.urls")),
]

此时运行项目,访问http://127.0.0.1:8000/user/login/

效果如下

2 登录页面view实现

登录需要表单来提交登录信息(账号和密码),这里我们使用Django From

user文件夹中新建forms.py, 添加以下代码来实现老师和学生的登录信息表单

from django import forms
from user.models import Student, Teacher class StuLoginForm(forms.Form):
uid = forms.CharField(label='学号', max_length=10)
password = forms.CharField(label='密码', max_length=30, widget=forms.PasswordInput) class TeaLoginForm(forms.Form):
uid = forms.CharField(label='教职工号', max_length=10)
password = forms.CharField(label='密码', max_length=30, widget=forms.PasswordInput)
  • A 添加模板(template)

    在项目的template/user文件夹下,添加login_detail.html:
{% extends "user/background.html" %}
{% block welcome_message %}
<div class="welcome-message">欢迎</div>
{% endblock %}
{% block login_container %}
{% if kind == "student" %}
<div class="login-kind-title">我是学生</div>
{% else %}
<div class="login-kind-title">我是老师</div>
{% endif %}
<div class = "form">
<form method="post">
{% csrf_token %}
{{form.as_p}}
<div class="submit-button">
<input type="submit" value="登录"/>
<a href="">注册</a>
</div>
</form>
<div class="return-button"><a href="{% url 'login' %}">返回上一页</a></div>
</div>
{% endblock %}
  • B 添加对应的视图(view)方法

    为了区分学生和老师,这里给该视图添加了kind参数

    kind必须为"teacher""student",如果不是的话,就会返回一个文本标明这不是一个合适的kind。

    所以需要在视图中添加用于返回的文本,考虑到后续也会有一些其他文本。

    这里建议把文本放在一个专门的py文件中,不仅方便修改和检查,在以后如果要支持多语言也方便。

这里在项目下建立一个constants.py文件,存放相关的文本

先添加一个标明这是不支持的kind的文本

INVALID_KIND = "Invalid kind.kind should be student or teacher."

./user/views.py中,添加方法

from django.http.response import HttpResponse

from constants import INVALID_KIND
from user.forms import StuLoginForm, TeaLoginForm def login(request, *args, **kwargs):
if not kwargs or kwargs.get("kind", "") not in ["student", "teacher"]:
return HttpResponse(INVALID_KIND) kind = kwargs["kind"]
context = {'kind': kind} if request.method == 'POST':
if kind == "teacher":
form = TeaLoginForm(data=request.POST)
else:
form = StuLoginForm(data=request.POST) if form.is_valid():
uid = form.cleaned_data["uid"] temp_res = "hello, %s" % uid
return HttpResponse(temp_res)
else:
context['form'] = form
else:
if kind == "teacher":
form = TeaLoginForm()
else:
form = StuLoginForm() context['form'] = form return render(request, 'user/login_detail.html', context)

由于还没有实现注册功能,所以这里的登录只先实现了各空壳,

填写账号密码就先直接各个hello的相应

  • C 设置主页的url

    ./user/urls.py中,给urlpatterns列表添加元素
path('login/<slug:kind>', views.login, name="login")

然后这个时候我们需要去更新下前面主页的href,指向对应的学生老师登录页

更新后的login_home.html文件如下

{% extends "user/background.html" %}
{% block login_container %}
<div class="login-kind student-login-button">
<a href="{% url 'login' 'student' %}">学生登录</a>
</div>
<div class="login-kind teacher-login-button">
<a href="{% url 'login' 'teacher' %}">教师登录</a>
</div>
{% endblock %}

此时运行项目,访问http://127.0.0.1:8000/user/login/

点击我是学生,对应页面效果:



随便填个学号密码(比如12345678)

点击登录后页面:

到这里,一个简陋的登录页面就算完成了

Django 小实例S1 简易学生选课管理系统 4 实现登录页面的更多相关文章

  1. Django 小实例S1 简易学生选课管理系统 6 实现登录逻辑

    Django 小实例S1 简易学生选课管理系统 第6节--实现登录逻辑 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 业务逻辑 本教程第四节里 ...

  2. Django 小实例S1 简易学生选课管理系统 12 CSS样式完善

    Django 小实例S1 简易学生选课管理系统 第12节--CSS样式完善 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块的逻辑代码到这里 ...

  3. Django 小实例S1 简易学生选课管理系统 11 学生课程业务实现

    Django 小实例S1 简易学生选课管理系统 第11节--学生课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,学生需要拥 ...

  4. Django 小实例S1 简易学生选课管理系统 10 老师课程业务实现

    Django 小实例S1 简易学生选课管理系统 第10节--老师课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,老师将要使 ...

  5. Django 小实例S1 简易学生选课管理系统 9 创建课程模型(model)

    Django 小实例S1 简易学生选课管理系统 第9节--创建课程模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 对于课程模块, ...

  6. Django 小实例S1 简易学生选课管理系统 8 CSS样式优化

    Django 小实例S1 简易学生选课管理系统 第8节--CSS样式优化 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 前面的几节下来,用户模块基 ...

  7. Django 小实例S1 简易学生选课管理系统 7 修改个人信息

    Django 小实例S1 简易学生选课管理系统 第7节--修改个人信息 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 用户模块除了注册登录之外,还 ...

  8. Django 小实例S1 简易学生选课管理系统 2 新建项目(project)并进行设置

    Django 小实例S1 简易学生选课管理系统 第2节--新建项目(project)并进行设置 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 0 ...

  9. Django 小实例S1 简易学生选课管理系统 3 创建用户模型(model)

    Django 小实例S1 简易学生选课管理系统 第3节--创建用户模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 本文涉及到的新 ...

随机推荐

  1. HashMap的tableSizeFor解析

    我们都知道,对于HashMap来说,数组的容量为2的倍数,但是我们可以在创建map的时候传入一个数组的大小 此时,这个初始化数组大小会传给一个双参的构造器 1. 创建HashMap public st ...

  2. 腾讯首个CNCF沙箱开源项目

    作者 SuperEdge开发者.腾讯云容器产品中心边缘计算团队.腾讯开源生态管理协会 SuperEdge 进入 CNCF 沙箱 2021 年 9 月 14 日,云原生分布式边缘容器系统 SuperEd ...

  3. ES5新增方法--查找方法--forEach(),filter(),some()区别

    1.forEach方法 迭代(遍历)数组 var arr = [1, 2, 3]; var sum = 0; arr.forEach(function (value, index, array) { ...

  4. 解决安装mysql 到start service出现未响应问题

    mysql下载地址 链接: https://pan.baidu.com/s/1vYpsNkVjUHqOKPQl9Y9A9A 提取码: wngn 安装可以参考 今天下载了MySql5.5,没想到的是前面 ...

  5. 《手把手教你》系列技巧篇(二十五)-java+ selenium自动化测试-FluentWait(详细教程)

    1.简介 其实今天介绍也讲解的也是一种等待的方法,有些童鞋或者小伙伴们会问宏哥,这也是一种等待方法,为什么不在上一篇文章中竹筒倒豆子一股脑的全部说完,反而又在这里单独写了一篇.那是因为这个比较重要,所 ...

  6. GDP区域分布图的生成与对比(ArcPy实现)

    一.背景 各地区经济协调发展是保证国民经济健康持续稳定增长的关键.GDP是反映各地区经济发展状况的重要指标.科学准确分析各地区GDP空间分布特征,对制定有效措施,指导经济协调发展具有重要参考价值. 二 ...

  7. vue3 element-plus 配置json快速生成table列表组件,提升生产力近500%(已在公司使用,持续优化中)

    ️本文为博客园首发文章,未获授权禁止转载 大家好,我是aehyok,一个住在深圳城市的佛系码农‍♀️,如果你喜欢我的文章,可以通过点赞帮我聚集灵力️. 个人github仓库地址: https:gith ...

  8. cf1082D Maximum Diameter Graph(构造+模拟+细节)

    QWQ不得不说 \(cf\)的\(edu\ round\)出这种东西 有点太恶心了 题目大意:给你\(n\)个点,告诉你每个点的最大度数值(也就是说你的度数要小于等于这个),让你构造一个无向图,使其满 ...

  9. 多项式(polynomial)

    多项式(polynomial) 题目大意: 给出一个 n 次多项式 \(f(x)=\sum_{i=0}^na_ix^i\) 对于\(k ≤ x ≤ k + l − 1\) 的\(l\) 个\(x\), ...

  10. .Net Core微信服务商二次进件

    最近商城进行微信服务商二次进件的开发,大致有几个点 一,服务商签名 二,服务商证书获取 三,图片上传 四,敏感信息加密 五,查询进件状态 除此之外,就是进件信息的拼装 电商二级商户进件申请单-状态流转 ...