靜態(tài)文件、中間件、分頁

1.靜態(tài)文件的使用

# 設(shè)置訪問靜態(tài)文件對(duì)應(yīng)的url地址,url以STATIC_URL開頭才認(rèn)為是訪問靜態(tài)文件的地址
STATIC_URL = '/static/'
# 設(shè)置靜態(tài)文件存放的靜態(tài)目錄
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

1.1 動(dòng)態(tài)生成靜態(tài)文件的url地址,代碼如下

先導(dǎo)入靜態(tài)文件: {% load staticfiles %}

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

2.中間件

中間件函數(shù)是 django 框架給我們預(yù)留的函數(shù)接口,讓我們可以干預(yù)請(qǐng)求和應(yīng)答的過程。

2.1 獲取瀏覽器端的ip地址

使用 request 對(duì)象的META屬性:request.META['REMOTE_ADDR']

2.2 django中間件的創(chuàng)建

在app軟件下新建一個(gè)python文件,一般叫做 middleware.py,在里面創(chuàng)建process_view方法,

這個(gè)方法是django預(yù)留的方法,并且需要在 settings.py 下的 MIDDLEWARE元組中進(jìn)行注冊(cè)

from django.utils.deprecation import MiddlewareMixin
def process_view(request, view_func, *view_args, **view_kwargs):
    """視圖函數(shù)調(diào)用之前會(huì)調(diào)用"""
    pass
# 一般在middleware.py文件下新建一個(gè)中間件類,類里面再寫process_view方法
# 詳見這次提交的middleware.py文件, 這個(gè)類必須繼承 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',  # 注冊(cè)中間件類
]

2.3 django定義的中間件預(yù)留函數(shù)

__init__:  # 服務(wù)器相應(yīng)第一個(gè)請(qǐng)求的時(shí)候調(diào)用
process_request:  # 是在產(chǎn)生request對(duì)象,進(jìn)行url匹配之前調(diào)用
process_view:  # 是在url匹配之后,調(diào)用視圖函數(shù)之前調(diào)用
process_response:  # 視圖函數(shù)調(diào)用之后,內(nèi)容返回給瀏覽器之前調(diào)用
process_exception:  # 視圖函數(shù)出現(xiàn)異常時(shí)會(huì)調(diào)用這個(gè)函數(shù)(后注冊(cè)先調(diào)用)

3. 后臺(tái)管理頁面的設(shè)置

3.1 模型頁對(duì)應(yīng)的列表頁上的設(shè)置

在admin.py文件下注冊(cè)模型類models.py下的模型類,使用以下代碼,其中AreaInfo是模型類,AreaInfoAdmin是模型管理類

admin.site.register(AreaInfo, AreaInfoAdmin)

修改后臺(tái)頁面顯示的標(biāo)題可以修改模型類(AreaInfo)的__str__方法,代碼如下所示

def __str__(self):   return self.atitle

在模型管理類(AreaInfoAdmin)和模型類(AreaInfo)中的部分代碼,可以進(jìn)行如下的設(shè)置

# admin.py下的模型管理類(AreaInfoAdmin)類下定義如下所示:
# 指定每頁顯示2條數(shù)據(jù)
list_per_page = 2

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

# 使后臺(tái)編輯頁下方顯示可編輯的下拉列表框
actions_on_bottom = True

# 使后臺(tái)編輯頁上方的下拉列表框隱藏
actions_on_top = False

# 控制列表頁右側(cè)的過濾器
list_filter = ['atitle']  # 可以是多個(gè)

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

# models.py文件下的模型類(AreaInfo)下的部分代碼如下所示:
# 如下方法對(duì)應(yīng)的標(biāo)題可在list_display中注冊(cè)
def title(self):
    return self.atitle
title.admin_order_field = 'atitle'  # 指定方法可以通過 atitle 屬性進(jìn)行排序
title.short_description = '地區(qū)名稱'  # 指定title的列標(biāo)題名字

def parent(self):
    if self.aParent is None:
        return ''
    return self.aParent.atitle
parent.short_description = '上級(jí)地區(qū)名稱'

3.2 編輯頁的部分操作

# fields 和 fieldsets 只能選擇其中一個(gè)
# fields = ['aParent', 'atitle']  # 修改編輯頁的 標(biāo)題 和 AParent 的上下順序
fieldsets = (  # fieldsets用于編輯頁的分組顯示
    ('基本', {'fields': ['atitle']}),
    ('高級(jí)', {'fields': ['aParent']}),
)

# 以下方法可以用于同時(shí)修改、添加、刪除數(shù)據(jù)庫的上級(jí)和下級(jí)地區(qū)
# 關(guān)聯(lián)對(duì)象,添加一端的嵌入模塊
class AreaStackedInline(admin.StackedInline):
    # 寫多類的名字
    model = AreaInfo  # 這里的地區(qū)模型類即是一類也是多類
    extra = 2  # 控制編輯頁下方可添加行為2行

class AreaTabularInline(admin.TabularInline):
    # 寫多類的名字
    model = AreaInfo  # 這里的地區(qū)模型類即是一類也是多類
    extra = 2  # 控制編輯頁下方可添加行為2行

# 模型管理類(AreaInfoAdmin)的屬性定義如下
# inlines = [AreaStackedInline]  # 嵌入下級(jí)地區(qū),以塊的形式嵌入
inlines = [AreaTabularInline]  # 嵌入下級(jí)地區(qū),以表格的形式嵌入

3.3 重寫admin后臺(tái)的網(wǎng)頁

本機(jī)地址為:D:\SoftwareIntsall\Python\Lib\site-packages\django\contrib\admin\templates\admin

4. 后臺(tái)上傳文件

4.1 配置上傳文件的保存目錄

# 設(shè)置配置上傳文件的保存目錄
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')

# 做好數(shù)據(jù)庫遷移
# 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 后臺(tái)處理文件的代碼如下:
def upload_handle(request):
    """上傳圖片處理"""
    # 1.獲取上傳文件的處理對(duì)象
    pic = request.FILES['pic']
    print(f'{type(pic)}')
    # 小于等于 2.5M 的處理對(duì)象類型為InMemoryUploadedFile類型,存儲(chǔ)在內(nèi)存中
    # <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
    # 大于 2.5M 的處理對(duì)象類型為TemporaryUploadedFile類型,存儲(chǔ)到一個(gè)臨時(shí)文件中
    # <class 'django.core.files.uploadedfile.TemporaryUploadedFile'>
    # pic.name 獲取到上傳文件的文件名
    # pic.chunks() 遍歷上傳文件的內(nèi)容
    # 2.創(chuàng)建一個(gè)文件
    save_path = f'{settings.MEDIA_ROOT}/booktest/{pic.name}'
    with open(save_path, 'wb') as f:
        # 3.獲取上傳文件的內(nèi)容,并寫到創(chuàng)建的文件中
        for content in pic.chunks():
            f.write(content)
    # 4.在數(shù)據(jù)庫中保存上傳記錄
    PicTest.objects.create(good_pic=f'booktest/{pic.name}')
    # 5.返回
    return HttpResponse('ok')

5. django分頁顯示

# 需要導(dǎo)入 Paginator 類
from django.core.paginator import Paginator

# Paginator 類的使用如下:
areas = AreaInfo.objects.filter(aParent__isnull=True)
# 分頁,每頁顯示2條
paginator = Paginator(areas, 2)
# print(f'分頁的總頁數(shù): {paginator.num_pages}')  # 獲取分頁的總頁數(shù)
# print(f'分頁的列表: {paginator.page_range}')  # 獲取分頁的列表
# page.has_previous 獲取分頁是否有上一頁
# page.previous_page_number 獲取分頁上一頁的頁碼
# page.has_next 獲取分頁是否有下一頁
# page.next_page_number 獲取分頁下一頁的頁碼
# page.paginator 獲取分頁的Paginator對(duì)象
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容