文章目录
一、在博客系统上的改动
之前完成的博客有几个页面内容都相同,可以改为通过type文章类型来获取文章; 通过前端传递想要获取文章类型,视图查询相关类型的文章,进行返回
视图
路由:要在当前路径后面加上一个组匹配(输入文章类型可查找)
模板
二、对于分页效果的总结
1.分页相关的方法
第一步:导包
from django.core.paginator import Paginator
第二步:根据其中的方法来分页
paginator = Paginator(article,5)
第三步:在拿到分页数据并按每页几条数据分页后有以下一些方法来帮助我们更好的使用分页: (作用对应的例子都是通过打印方法得到的数据)
第四步:根据当前页page_obj = paginator.page(page) 来操作分页方法对显示页码进行调整(上一页,下一页,尾页,首页等效果)
from django.core.paginator import Paginator
article = Article.objects.all().order_by("-date")
paginator = Paginator(article,5)
page_obj = paginator.page(2)
下面所用到的变量都已在上面的式子中赋值
分页方法 | 作用 |
---|---|
paginator.count | 返回内容总条数(获取到的所有数据的数量)如103条符合条件的数据 |
paginator.page_range | 可迭代的页数,我们可以取得页数范围 如 range(1, 22) |
paginator.num_pages | 返回的是最大页数 如21 |
paginator.page(page) paginator.page(1) | page中可传值,对应的则是在可有页数据中的对象 如<Page 1 of 21> 21页中的第一页;是对象可以遍历,遍历该对象所在页中的数据 |
page_obj.number | 当前页数 如2 |
page_obj.has_next() | 有没有下一页,返回值是True 或 False |
page_obj.has_previous | 有没有上一页,返回值是True 或 False |
page_obj.has_other_pages() | 判断是否还有其他页,返回值是True 或 False |
page_obj.next_page_number() | 返回下一页的页码 如 3,如果没有则抛出异常:本页值为空 |
page_obj.previous_page_number | 返回上一页的页码 如 1,如果没有则抛出异常:本页值为空 |
一些例子:
2.通过分页的相关方法来实现分页的效果
实现效果:实现每页6条数据,下面显示页码固定为五条,有首页,上一页,下一页和尾页的功能
在模板中:
视图中:
路由中:
未增加更多数据,结果只能如下:
三、对于类模型中性别设置1,0在页面中显示对于男女的测试
类模型中:
视图中:
路由中:
四、实现密码加密(md5.digest 和md5.hexdigest 的区别)
1.密码加密
第一步:导包
import hashlib
第二步:定义密码加密函数setPassword
def setPassword(password):
## 实现一个密码加密
md5 = hashlib.md5() ## 创建一个md5的实例对象
md5.update(password.encode()) ## 对密码编码进行加密
result = md5.hexdigest() ## 拿到加密字符串hex是十六进制加密
return result
2.md5.digest 和md5.hexdigest 的区别
① md5.digest
md5.digest() 代表拿到加密字符串但加密字符串是二进制的
② md5.hexdigest
md5.hexdigest() 代表拿到的是十六进制的加密字符串
③ 查看加密字符串:
hashlib.md5.digest() 加密后的结果用二进制表示
查看内容可以使用print hashlib.md5(str).digest()
md5(str)括号中的str填写要加密的字符串
五、重定向(利用重定向可以实现用户登录主页效果)
第一步:导包
from django.http import HttpResponseRedirect
实现效果:用户输入用户名及密码正确重定向到主页面
重定向实现成功
六、设置cookie和session的作用
① 使用cookie可以使用户访问服务器不用重复输入用户名密码实现页面间的切换
使用服务器提供的cookie即可避免这一操作;session同样可实现此功能;
但由于cookie保存在本地,可被修改和模仿,导致安全性较低;
而session保存在服务器,一般放在数据库中,所以安全性较高;
也正因为存放地点的原因,使用cookie速率快,校验快,session的速率慢校验慢;
所以一般用cookie和session结合的方式来保证安全和效率
② 使用cookie可以实现从页面中退出登录的效果
可以通过删除cookie的值来重定向到登录页面;session亦可实现
登出功能:
## 登出
def logout(request):
response = HttpResponseRedirect("/index/")
# 删除cookie
response.delete_cookie("username")
# 删除session 删除指定session 删除的是保存在服务器上面的值
del request.session["username"]
## 删除所有的session
# request.session.flush()
return response
在装饰器中可以写一个判断,如果cookie值不存在,即跳转至登录页面
在给需要添加验证的页面加上装饰器,即用户无cookie无法登录页面
七、用前端验证和后端验证来实现注册
① 前端验证
路由:
写好的py文件,创建的类;forms前端验证
第一步:导包
from django import forms
第二步:创建类(字段约束和类模型的一样)
视图:
第一步:先从写好的py文件中导入定义好的前端验证类
from Article.forms import Register
def register(request):
return render(request, 'register_old2.html', locals())
第二步:实例化对象
模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<div>
<h3>普通的样式</h3>
{{ register_form }}
<hr>
</div>
<div>
<h3>p标签的样式</h3>
{{ register_form.as_p }}
<hr>
</div>
<div>
<h3>ul标签的样式</h3>
{{ register_form.as_ul }}
<hr>
</div>
<div>
<h3>table标签的样式</h3>
{# table标签和普通样式一样#}
{{ register_form.as_table }}
<hr>
</div>
<h3>自定义table样式</h3>
<div>
<form action="" method="post">
{% csrf_token %}
<table>
{% for one in register_form %}
<tr>
<th>
{{ one.label }}
</th>
<td>
{{ one }}
</td>
</tr>
{% endfor %}
<tr>
<th>
<input type="submit" value="提交">
</th>
</tr>
</table>
</form>
{{ content }}
</div>
</body>
</html>
前端验证自带form表单模式,但没有提交的功能,所以我们要在外面加上form表单,增加一个form的提交按钮(除了他提供的样式,我们也可以自定义样式)
注意:不要忘了在模板中导入实例对象,不然无法调用forms前端验证
{{ register_form }}
效果:
必须填写姓名
密码的填写必须和数据一模一样,最多8位,即使你写再多他都不会超过8位
添加成功
② 后端验证
路由:
写好的py文件,创建的类;写好后端验证
cleaned_data中的值类型与字段定义的Field类型一致。
cleaned_data 就是读取表单返回的值,返回类型为字典dict型
视图:
第一步:先从写好的py文件中导入定义好的前端验证类
from Article.forms import Register
def register(request):
return render(request, 'register.html', locals())
第二步:实例化对象
模板:
效果:
验证成功