静态文件、中间件、分页

1.静态文件的使用

# 设置访问静态文件对应的url地址,url以STATIC_URL开头才认为是访问静态文件的地址
STATIC_URL = '/static/'
# 设置静态文件存放的静态目录
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

1.1 动态生成静态文件的url地址,代码如下

先导入静态文件: {% load staticfiles %}

再使用: <img src="{% static 'images/bg.jpg' %}">

2.中间件

中间件函数是 django 框架给我们预留的函数接口,让我们可以干预请求和应答的过程。

2.1 获取浏览器端的ip地址

使用 request 对象的META属性:request.META['REMOTE_ADDR']

2.2 django中间件的创建

在app软件下新建一个python文件,一般叫做 middleware.py,在里面创建process_view方法,

这个方法是django预留的方法,并且需要在 settings.py 下的 MIDDLEWARE元组中进行注册

from django.utils.deprecation import MiddlewareMixin
def process_view(request, view_func, *view_args, **view_kwargs):
    """视图函数调用之前会调用"""
    pass
# 一般在middleware.py文件下新建一个中间件类,类里面再写process_view方法
# 详见这次提交的middleware.py文件, 这个类必须继承 MiddlewareMixin
class BlockedIPSMiddleware(MiddlewareMixin):
    pass

# settings.py 文件下的代码如下:
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'booktest.middleware.BlockedIPSMiddleware',  # 注册中间件类
]

2.3 django定义的中间件预留函数

__init__:  # 服务器相应第一个请求的时候调用
process_request:  # 是在产生request对象,进行url匹配之前调用
process_view:  # 是在url匹配之后,调用视图函数之前调用
process_response:  # 视图函数调用之后,内容返回给浏览器之前调用
process_exception:  # 视图函数出现异常时会调用这个函数(后注册先调用)

3. 后台管理页面的设置

3.1 模型页对应的列表页上的设置

在admin.py文件下注册模型类models.py下的模型类,使用以下代码,其中AreaInfo是模型类,AreaInfoAdmin是模型管理类

admin.site.register(AreaInfo, AreaInfoAdmin)

修改后台页面显示的标题可以修改模型类(AreaInfo)的__str__方法,代码如下所示

def __str__(self):   return self.atitle

在模型管理类(AreaInfoAdmin)和模型类(AreaInfo)中的部分代码,可以进行如下的设置

# admin.py下的模型管理类(AreaInfoAdmin)类下定义如下所示:
# 指定每页显示2条数据
list_per_page = 2

# list_display列表添加模型类的属性或者模型类的方法
list_display = ['id', 'atitle', 'title', 'parent']

# 使后台编辑页下方显示可编辑的下拉列表框
actions_on_bottom = True

# 使后台编辑页上方的下拉列表框隐藏
actions_on_top = False

# 控制列表页右侧的过滤器
list_filter = ['atitle']  # 可以是多个

# 添加控制列表页上方的搜索框
search_fields = ['atitle']

# models.py文件下的模型类(AreaInfo)下的部分代码如下所示:
# 如下方法对应的标题可在list_display中注册
def title(self):
    return self.atitle
title.admin_order_field = 'atitle'  # 指定方法可以通过 atitle 属性进行排序
title.short_description = '地区名称'  # 指定title的列标题名字

def parent(self):
    if self.aParent is None:
        return ''
    return self.aParent.atitle
parent.short_description = '上级地区名称'

3.2 编辑页的部分操作

# fields 和 fieldsets 只能选择其中一个
# fields = ['aParent', 'atitle']  # 修改编辑页的 标题 和 AParent 的上下顺序
fieldsets = (  # fieldsets用于编辑页的分组显示
    ('基本', {'fields': ['atitle']}),
    ('高级', {'fields': ['aParent']}),
)

# 以下方法可以用于同时修改、添加、删除数据库的上级和下级地区
# 关联对象,添加一端的嵌入模块
class AreaStackedInline(admin.StackedInline):
    # 写多类的名字
    model = AreaInfo  # 这里的地区模型类即是一类也是多类
    extra = 2  # 控制编辑页下方可添加行为2行

class AreaTabularInline(admin.TabularInline):
    # 写多类的名字
    model = AreaInfo  # 这里的地区模型类即是一类也是多类
    extra = 2  # 控制编辑页下方可添加行为2行

# 模型管理类(AreaInfoAdmin)的属性定义如下
# inlines = [AreaStackedInline]  # 嵌入下级地区,以块的形式嵌入
inlines = [AreaTabularInline]  # 嵌入下级地区,以表格的形式嵌入

3.3 重写admin后台的网页

本机地址为:D:\SoftwareIntsall\Python\Lib\site-packages\django\contrib\admin\templates\admin

4. 后台上传文件

4.1 配置上传文件的保存目录

# 设置配置上传文件的保存目录
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')

# 做好数据库迁移
# python manage.py makemigrations
# python manage.py migrate

4.2 配置浏览器上传文件的操作

4.2.1 模板文件下的代码必须包含如下表单:
<form method="post" action="/upload_handle" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="pic"><br/>
    <input type="submit" value="上传图片">
</form>
4.2.2 后台处理文件的代码如下:
def upload_handle(request):
    """上传图片处理"""
    # 1.获取上传文件的处理对象
    pic = request.FILES['pic']
    print(f'{type(pic)}')
    # 小于等于 2.5M 的处理对象类型为InMemoryUploadedFile类型,存储在内存中
    # <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
    # 大于 2.5M 的处理对象类型为TemporaryUploadedFile类型,存储到一个临时文件中
    # <class 'django.core.files.uploadedfile.TemporaryUploadedFile'>
    # pic.name 获取到上传文件的文件名
    # pic.chunks() 遍历上传文件的内容
    # 2.创建一个文件
    save_path = f'{settings.MEDIA_ROOT}/booktest/{pic.name}'
    with open(save_path, 'wb') as f:
        # 3.获取上传文件的内容,并写到创建的文件中
        for content in pic.chunks():
            f.write(content)
    # 4.在数据库中保存上传记录
    PicTest.objects.create(good_pic=f'booktest/{pic.name}')
    # 5.返回
    return HttpResponse('ok')

5. django分页显示

# 需要导入 Paginator 类
from django.core.paginator import Paginator

# Paginator 类的使用如下:
areas = AreaInfo.objects.filter(aParent__isnull=True)
# 分页,每页显示2条
paginator = Paginator(areas, 2)
# print(f'分页的总页数: {paginator.num_pages}')  # 获取分页的总页数
# print(f'分页的列表: {paginator.page_range}')  # 获取分页的列表
# page.has_previous 获取分页是否有上一页
# page.previous_page_number 获取分页上一页的页码
# page.has_next 获取分页是否有下一页
# page.next_page_number 获取分页下一页的页码
# page.paginator 获取分页的Paginator对象
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容