本篇将对前面的图书管理系统进行优化:代码简化;添加分页;添加token;部分代码使用CBV;优化静态文件配置;设置名称空间,命名URL与反向解析;使用ajax来完成局部刷新。
代码简化
Django模板引擎中最强大、最复杂的是模板继承。通过定义一个基础的模板,在定义子模版的时候,只需要覆盖母板中的块,就可以达到简化的目的。
具体来说,对于定义的所有模板它们都是很重复的,导航相同,左侧栏相同,只有内容不同。在这个基础上,将相同的地方抽取出来作为母版
base.html
定义母板
base.html
这里包含了,导航栏,左侧栏,以及内容的一个外框架。在需要修改的地方留下块。
具体方法 移步 django模板系统
1 |
|
note:这个页面在后面有些改动,会将导航栏剥离出去。
子模板中导入
- 在子模板的最上方使用
extends
标签进行导入 - 在
block
标签中覆写。
例如:在author_list.html
中,导入母板后,覆写了两块内容,一块是在左侧栏中,如果当前是作者页面的话改为被点击的状态;一块是对作者信息进行展示的 table
。
1 | {% extends 'base.html' %} |
对于添加和编辑页面,我们不想要左侧栏,只需要导航栏和内容框就可以,这样的话使用组件,可以达到要求。
将导航栏做成组件
- 定义 nav.html
- 使用导航栏的时候,只需要使用
include
标签就行 - 组件的理解:将子模版渲染并嵌入当前HTML中
nav.html
1 |
|
author_add.html
- 一部分是通过 include 导入
- 另一部分写剩下的内容(一个表单)
1 | {% include 'nav.html' %} |
编辑的做法与添加的做法相同,这里就不再重复了。
修改母板
由于开始定义母版的时候是把导航栏放在里面的,我们把它剥离出来。
base.html
1 |
|
小结
以上对于相同部分,我们做成母版只定义一次。从而达到简化代码的效果。
添加分页
分页是直接使用的bootstrap中的分页组件
1 | <nav aria-label="Page navigation"> |
在开始之前做一个区分,前面将导航栏做成组件的方法可以用来实现分页吗?不行,因为分页的数量不是固定的。
inclusion_tag
使用 inclusion_tag
可以返回一个动态的页面
定义
先做app01下创建一个python包,名为
templatestags
在这个包内创建py文件,文件名可以自定义 my_tags.py
在这个创建的py文件内写入:
1
2
3
4
5
6from django import template
register = template.Library() # register的名字不能变
或
from django.template import Library
register = Library()定义函数 + 装饰器
1
2
3
def page(num):
return {'num':range(1,num+1)}
使用
- 在
author_list.html
的 table 下方导入 - 分为3页
1 | {% load my_tags %} |
添加token
在前面我们将settings.py的中间件中关于csrf注释了,这是因为在提交post请求时没有携带token,服务器拒绝接收。
那我们只需要在form表单中写如下内容即可:
1
2
3<form action="" method="post">
{% csrf_token %}
</form>放在form标签后,form表单中产生有一个隐藏的标签 name = ‘csrfmiddlewaretoken’ ,这个标签的name:value 会在表单提交的时候一并提交。
优化静态文件配置
- 如果我们修改了settings.py 中的
STATIC_URL = '/static/'
那么其它文件的导入都需要修改,那么怎样能避免修改呢?
1 | 加载: |
- load static表示执行
static.py
这个文件 - static 表示执行这个函数,将相对路径转成绝对路径
- get_static_prefix 执行这个函数,可以得到静态文件的前缀,如我们以前的
/static/
使用CBV优化
我们先前在 views.py
中写的是函数是 FBV
,但这种方式存在一个缺点,就是我们需要手动判断请求方式,这样的话不同请求方式会不断地叠加,不够清晰。所以重新以CBV来改造。
命名URL
1 | url(r'^del/', views.publisher_del, name='del'), |
1 | <a href="{% url 'publish:del' %}/?pk={{ publisher.pk }}" class="btn btn-danger">删除</a> |
改后: (整合到url中)
1 | url(r'^del/(\d+)', views.publisher_del, name='del'), |
1 | <a href="{% url 'publish:del' %}/{{ publisher.pk }}" class="btn btn-danger">删除</a> |
待补充!!!