静态文件
·将静态文件放到一个单独的目录中,以方便管理
- 静态文件可以放在项目根目录下,也可以放在应用的目录下
- 由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理
·在项目的setting文件中,通过STATICFILES_DIRS列表配置静态文件的加载路径
·在html页面调用静态文件时,需要指定静态文件所在的路径
·为了安全和方便维护,可以通过配置项达到隐藏真实静态文件路径的目的
- 使用static标签,根据配置项动态生成静态文件路径(结合Nginx布署时,会将所有的静态文件都交给Nginx处理,而不用转到Django部分,所以这项配置就无效了,这个功能有些鸡肋!)
#反向解析加载静态图片路径
{% load staticfiles %}
{% static 'images/01.jpg'%}
中间件
·概念:Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出;中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC。
·使用场景:当某些操作在每次请求或响应时都会执行时,可以写在中间件中
·设计思想:面向切面编程/无侵害式编程
# 中间件方法(Django在中间件中预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干预)
1.初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件
def __init__():
pass
2.处理请求前:在每个请求上调用,返回None或HttpResponse对象
def process_request(request):
pass
3.处理视图前:在每个请求上调用,返回None或HttpResponse对象
def process_view(request, view_func, view_args, view_kwarge):
pass
4.处理模板相应前:在每个请求上调用 ,返回实现了render方法的相应对象
def process_temlate_pesponse(request, response):
pass
5.处理响应后:所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
def process_response(request, response):
pass
6.异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
def process_exception(request, exception)
# 自定义中间件
- 中间件是一个独立的python类,可以定义这六个方法中的一个或多个
- 在应用中新建middleware.py文件,在文件中定义类TestMiddleware
- 配置自定义中间件:应用.文件名.类名 == Book.middleware.TestMiddleware
#如果多个中间件中注册了相同的方法,则先注册的后执行
相关推荐:《Python教程》
站点管理
·内容发布的部分由网站的管理员负责,包括查看、添加、修改、删除数据
·Django项目中默认启用Admin管理站点:列表页选项, 编辑页选项, 重写模板
#准备工作
启用mysql数据库+定义AreaInfo模型类+创建管理员+注册模型类
再 重写模型__str__
# 控制站点管理页的展示
- 类ModelAdmin可以控制模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式
- 注册模型类前定义管理类AreaAdmin
class AreaAmin(admin.ModelAdmin):
pass
- 管理类有两种使用方式
1.注册参数
admin.site.register(AreaInfo, AreaAdmin)
2.装饰器
@admin.register(AreaInfo)
class AreaAmin(admin.ModelAdmin):
pass
列表页选项
·页大小
#设置每页展示的条数,默认每页显示100条
list_per_page = 100
·操作选项Action的位置:默认在管理页面的顶部有一个,管理页面底部没有
# 在头部增加一个
actions_on_top = True
# 在底部增加一个
actions_on_bottom = False
·列表中的列: 指定在模型列表中显示哪些字段作为列
# 指定展示的字段
list_display = [字段1, 字段2, ...]
# 定义模型方法作为列
def title(self):
return self.name
# 指定方法作为列的排序依据
title.admin_order_field = 'name'
·模型方法为列:模型方法和模型字段都指定为列显示在管理界面上
·列标题:默认为属性或方法的名称,可以通过属性设置为其他名称。设置方式
1.short_description 属性设置
- 方法名.short_description = '列标题
2.verbose_name 属性设置
右侧栏过滤器:只能接收字段,会将对应字段的值列出来,用于快速过滤,一般用于有重复值的字段
list_filter = ['字段1', '字段2', ...]
搜索框:用于对指定字段的值进行搜索,支持模糊查询
search_fields = ['字段1', '字段2', ...]
编辑页选项
·字段顺序:根据列表顺序指定编辑界面字段顺序
fields = ['字段1', '字段2', ...]
·字段分组:字段分组fieldsets与字段顺序fields二选一使用
fieldsets = (
('组1标题', {'fields': ('字段1', '字段2')}),
('组2标题', {'fields': ['字段3', '字段4']}),
)
·关联对象
在一对多的关系中,可以在一端的编辑页面中编辑多端的对象
- 嵌入多端对象的方式包括表格、块两种
类型InlineModelAdmin:表示在模型的编辑页面嵌入关联模型的编辑
- 子类StackedInline:以块的形式嵌入
- 子类TabularInline:以表格的形式嵌入
在admin.py文件中,创建AreaStackedInline类,继承自admin.StackedInline
重写模板
·当我们需要修改站点管理页面的样式时,可以重写站点的模板
在templates 目录下创建 admin目录
再在admin文件下创建base_site.html
上传图片
·两种方式上传图片(上传后,将图片存储在项目静态文件中,然后将图片的路径存储在数据库表中)
·在站点管理页面中上传图片
·自定义form表单中上传图片
# 保存在static目录下,media表示多媒体文件目录,图片上传后保存的路径:static/media/Book
# 在settings中,配置图片上传后保存的目录
MEIA_ROOT=os.path.join(BASE_DIR, 'static/media')
# 后台站点上传图片
# 自定义表单上传图片
chunks() 保证数据安全
分页
·Django提供了数据分页类,定义在django.core.paginator中
·对象Paginator是用来进行分页处理的,可以把一组数据按照每页n条进行分隔
·对象Page用于表示第m页的数据
#Paginator对象
方法init(列表,int):返回分页对象,参数为列表数据,每面数据的条数
方法page(m):返回Page对象,表示第m页的数据,下标以1开始
属性page_range:返回页码列表,从1开始,例如[1, 2, 3, 4]
属性count:返回对象总数
属性num_pages:返回页面总数
#Page对象
调用Paginator对象的page()方法返回Page对象,不需要手动构造
属性number:返回当前是第几页,从1开始
属性paginator:当前页对应的Paginator对象
方法has_next():如果有下一页返回True
方法has_previous():如果有上一页返回True
属性object_list:返回当前页对象的列表
方法len():返回当前页面对象的个数