1.静态文件:
- 项目中的CSS、图片、js都是静态文件
- 一般会将静态文件放到一个单独的目录中,以方便管理
- 在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路径
- 静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理
1.在项目/settings.py文件中定义静态文件查找路径
STATIC_URL ='/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
]
2.在项目根目录下创建static目录,再创建img、css、js目录
3.在应用名称booktest/views.py中定义视图jingtai
defjingtai(request):
returnrender(request,'booktest/jingtai.html')
4.在booktest/urls.py中配置url
url(r'^jingtai/$',views.jingtai),
5.在templates/booktest/下创建jingtai.html文件
动态配置:
{%load static from staticfiles%}
<img src="{%static "img/sg.png" %}"/>
1.问题一:django如何确定当前请求静态文件?
http://127.0.0.1:8000/static/images/bjt.png
答:请求路径/static/images/bjt.png中开始的部分/static/
与settings.py中STATIC_URL进行对比,如果相同则认为是静态文件
2. 问题二:在磁盘的哪个目录下找静态文件?
答:判断后剩下路径images/bjt.png
方案一:与settings.py中的STATICFILES_DIRS进行拼接
方案二:在应用目录下的static目录下查找
2.中间件
- Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出
- 中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC
- Django在中间件中常用方法不同的阶段执行:
- process_request
- process_view
- process_response
1.问题一:什么时候使用中间件?
答:当大部分的视图中都需要执行一段相同代码时
2.问题二:怎么用?
答:定义类,选择函数,安装
3.问题三:使用哪个函数呢?
答:根据代码的执行时间来判断
3.Admin站点
- 内容发布的部分由网站的管理员负责查看、添加、修改、删除数据,开发这些重复的功能是一件单调乏味、缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块
- 在Django项目中默认启用Admin管理站点
1.准备工作:创建管理员的用户名和密码:
python manage.pycreatesuperuser
- 2.按提示填写用户名、邮箱、密码
- 3.使用:在应用的admin.py中注册模型类
fromdjango.contrib import admin
from models import *
admin.site.register(AreaInfo)
- 4.输入如下网址
http://127.0.0.1:8000/admin/
- 5.按提示填写用户名、密码,点击“Log in”按钮登录
管理类有两种使用方式
- 1.注册参数:打开booktest/admin.py文件,注册模型类代码如下
admin.site.register(AreaInfo,AreaAdmin)
- 2.装饰器:打开booktest/admin.py文件,在管理类上注册模型类,代码如下
@admin.register(AreaInfo)
class AreaAdmin(admin.ModelAdmin):
pass
列表页选项
页大小
- 每页中显示多少条数据,默认为每页显示100条数据,属性如下
list_per_page=100
“操作选项”的位置
- 顶部显示的属性,设置为True在顶部显示,设置为False不在顶部显示,默认为True
actions_on_top=True
列表中的列
- 属性如下
list_display=[模型字段1,模型字段2,...]
将方法作为列
- 列可以是模型字段,还可以是模型方法,要求方法有返回值
- 打开booktest/models.py文件,修改AreaInfo类如下
classAreaInfo(models.Model):
...
def title(self):
return self.atitle
- 打开booktest/admin.py文件,修改AreaAdmin类如下
classAreaAdmin(admin.ModelAdmin):
...
list_display = ['id','atitle','title']
- 方法列是不能排序的,如果需要排序需要为方法指定排序依据
admin_order_field=模型类字段
列标题
- 列标题默认为属性或方法的名称,可以通过属性设置
- 需要先将模型字段封装成方法,再对方法使用这个属性,模型字段不能直接使用这个属性
short_description='列标题'
关联对象
- 无法直接访问关联对象的属性或方法,可以在模型类中封装方法,访问关联对象的成员
- 打开booktest/models.py文件,修改AreaInfo类如下
classAreaInfo(models.Model):
...
def parent(self):
return self.aParent.atitle
parent.short_description='父级区域名称'
右侧栏过滤器
- 属性如下,只能接收字段,会将对应字段的值列出来,用于快速过滤
list_filter=[]
搜索框
- 属性如下,用于对指定字段的值进行搜索,支持模糊查询
search_fields=[]
中文标题
- 打开booktest/models.py文件,修改模型类,为属性指定verbose_name参数,即第一个参数
classAreaInfo(models.Model):
atitle=models.CharField('标题',max_length=30)#名称
编辑页选项
显示字段顺序
- 属性如下
fields=[]
分组显示
- 属性如下
fieldset=(
('组1标题',{'fields':('字段1','字段2')}),
('组2标题',{'fields':('字段3','字段4')}),
)
关联对象
- 在一对多的关系中,可以在一端的编辑页面中编辑多端的对象,嵌入多端对象的方式包括表格、块两种
- 类型InlineModelAdmin:表示在模型的编辑页面嵌入关联模型的编辑
- 子类TabularInline:以表格的形式嵌入
- 子类StackedInline:以块的形式嵌入
- 打开booktest/admin.py文件,创建AreaStackedInline类
classAreaStackedInline(admin.StackedInline):
model = AreaInfo#关联子对象
extra = 2#额外编辑2个子对象
重写模板
- 在templates/目录下创建admin目录
- 打开当前虚拟环境中Django的目录,再向下找到admin的模板
- 将需要更改文件拷贝到第一步建好的目录里,编辑文件
4.上传图片
- 在Django中上传图片包括两种方式:
- 1.在管理页面admin中上传图片
- 2.自定义form表单中上传图片
- 上传图片后,将图片存储在服务器上,然后将图片的路径存储在表中
在管理页面admin中上传图片
注册:admin.site.register(PicTest)
自定义form表单中上传图片
1.打开booktest/views.py文件,创建视图
- 2.打开booktest/urls.py文件,配置url
- 3.在templates/booktest/目录下创建模板pic_upload.html
- 注:在模板中定义上传表单,要求如下
- form的属性enctype="multipart/form-data"
- form的method为post
- input的类型为file
5.分页
- Django提供了数据分页的类,这些类被定义在django/core/paginator.py中
- 对象Paginator用于对列进行一页n条数据的分页运算
- 对象Page用于表示第m页的数据
Paginator对象
- 方法init(列表,int):返回分页对象,参数为列表数据,每面数据的条数
- 属性count:返回对象总数
- 属性num_pages:返回页面总数
- 属性page_range:返回页码列表,从1开始,例如[1, 2, 3, 4]
- 方法page(m):返回Page对象,表示第m页的数据,下标以1开始
Page对象
- 调用Paginator对象的page()方法返回Page对象,不需要手动构造
- 属性object_list:返回当前页对象的列表
- 属性number:返回当前是第几页,从1开始
- 属性paginator:当前页对应的Paginator对象
- 方法has_next():如果有下一页返回True
- 方法has_previous():如果有上一页返回True
- 方法len():返回当前页面对象的个数
- 迭代页面对象:访问当前页面中的每个对象