django10

上傳圖片

在python中進(jìn)行圖片操作袱贮,需要安裝包PIL加派。

pip install Pillow==3.4.1

在Django中上傳圖片包括兩種方式:

  • 在管理頁面admin中上傳圖片
  • 自定義form表單中上傳圖片
    上傳圖片后,將圖片存儲在服務(wù)器上屑咳,然后將圖片的路徑存儲在表中跛梗。

在管理頁面admin中上傳圖片

創(chuàng)建包含圖片的模型類
將模型類的屬性定義成models.ImageField類型。

1)打開booktest/models.py文件翘骂,定義模型類PicTest壁熄。

class PicTest(models.Model):
    pic = models.ImageField(upload_to='booktest/')

2)回到命令行中,生成遷移碳竟。

python manage.py makemigrations
python manage.py migrate

3)打開booktest/migrations/0001_initial.py文件草丧,刪除AreaInfo部分,因?yàn)檫@個表已經(jīng)存在莹桅。
4)因?yàn)楫?dāng)前沒有定義圖書昌执、英雄模型類,會提示“是否刪除”,輸入“no”后回車懂拾,表示不刪除煤禽。

  1. 在booktest.admin目錄下注冊
from booktest.models import PicTest
admin.site.register(PicTest)

(此時運(yùn)行服務(wù)器,上傳圖片岖赋,但圖片將會直接被傳到booktest目錄下檬果,造成混亂,因此....)
6)在static目錄下創(chuàng)建media目錄唐断,再創(chuàng)建應(yīng)用名稱的目錄选脊,此例為booktest。


7)打開test5/settings.py文件脸甘,設(shè)置圖片保存路徑恳啥。
因?yàn)閳D片也屬于靜態(tài)文件,所以保存到static目錄下丹诀。

MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")`

8)運(yùn)行服務(wù)器角寸,在瀏覽器中輸入如下網(wǎng)址:
登錄賬戶



選擇圖片



上傳成功

刷新數(shù)據(jù)庫

刷新項(xiàng)目


自定義form表單中上傳圖片

1)打開booktest/views.py文件,創(chuàng)建視圖pic_upload忿墅。

def pic_upload(request):
    return render(request,'booktest/pic_upload.html')

2)打開booktest/urls.py文件,配置url沮峡。

url(r'^pic_upload/$', views.pic_upload),

3)在templates/booktest/目錄下創(chuàng)建模板pic_upload.html疚脐。
在模板中定義上傳表單,要求如下:

  • form的屬性enctype="multipart/form-data"
  • form的method為post
  • input的類型為file
  • action="/pic_handle/"
<html>
<head>
    <title>自定義上傳圖片</title>
</head>
<body>
    <form method="post" action="/pic_handle/" enctype="multipart/form-data">
        {%csrf_token%}
        <input type="file" name="pic"/><br>
        <input type="submit" value="上傳">
    </form>
</body>
</html>

4)打開booktest/views.py文件邢疙,創(chuàng)建視圖pic_handle棍弄,用于接收表單保存圖片。
request對象的FILES屬性用于接收請求的文件疟游,包括圖片呼畸。

from django.conf import settings
from django.http import HttpResponse
...
def pic_handle(request):
    """
    上傳圖片處理
    :param request:
    :return:
    """
    pic = request.FILES.get('pic')
    # 返回圖片名
    print(pic.name)
    # 把圖片存放到static文件夾下的media目錄
    # 指定圖片的存儲路徑 static/media/booktest/pic.name
    save_path = '{}/booktest/{}'.format(settings.MEDIA_ROOT,pic.name)
    # 將文件進(jìn)行寫入
    with open(save_path,'wb') as f:
        for content in pic.chunks():
            f.write(content)
    # 在數(shù)據(jù)庫中保存上傳記錄 導(dǎo)入到數(shù)據(jù)庫中
    # 絕對路徑
    # PicTest.objects.create(pic=save_path)
    pic_Test=PicTest.objects.create(pic='booktest/{}'.format(pic.name))
    # return HttpResponse('OK')
    # 從數(shù)據(jù)庫中調(diào)取剛才上傳的路徑
    print(pic_Test.pic)
    path = 'pic_Test'
    context = {'pic':path}
    return render(request, 'booktest/pic_show.html', context=context)

5)打開booktest/urls.py文件,配置url颁虐。

url(r'^pic_handle/$', views.pic_handle),

6)運(yùn)行服務(wù)器蛮原,在瀏覽器中輸入如下網(wǎng)址:

http://127.0.0.1:8000/pic_upload/

運(yùn)行結(jié)果如下:


顯示圖片

1)打開booktest/views.py文件,添加如下代碼另绩。

 # 上傳后在新頁面中返回上傳的圖片
    print(pic_Test.pic)
    # 從數(shù)據(jù)庫中獲取剛才上傳圖片的路徑
    # path = 'pic_Test'
    # context = {'pic': path}
    context = {'pic': pic_Test}
    return render(request, 'booktest/pic_show.html', context=context)

2)打開booktest/urls.py文件儒陨,配置url。

url(r'^pic_show/$', views.pic_show),

3)在templates/booktest/目錄下創(chuàng)建模板pic_show.html笋籽。

<html>
<head>
    <title>顯示上傳的圖片</title>
</head>
<body>
<img style="width: 200px ; height: 300px" src="/static/media/{{pic.pic}}"/>
</body>
</html>

4)運(yùn)行服務(wù)器蹦漠,在瀏覽器中輸入如下網(wǎng)址:

http://127.0.0.1:8000/pic_show/
image.png

分頁

Django提供了數(shù)據(jù)分頁的類,這些類被定義在django/core/paginator.py中车海。 類Paginator用于對列進(jìn)行一頁n條數(shù)據(jù)的分頁運(yùn)算笛园。類Page用于表示第m頁的數(shù)據(jù)。

Paginator類實(shí)例對象

  • 方法init(列表,int):返回分頁對象,第一個參數(shù)為列表數(shù)據(jù)研铆,第二個參數(shù)為每頁數(shù)據(jù)的條數(shù)埋同。
  • 屬性count:返回對象總數(shù)。
  • 屬性num_pages:返回頁面總數(shù)蚜印。
  • 屬性page_range:返回頁碼列表莺禁,從1開始,例如[1, 2, 3, 4]窄赋。
  • 方法page(m):返回Page類實(shí)例對象哟冬,表示第m頁的數(shù)據(jù),下標(biāo)以1開始忆绰。

Page類實(shí)例對象

  • 調(diào)用Paginator對象的page()方法返回Page對象浩峡,不需要手動構(gòu)造。
  • 屬性object_list:返回當(dāng)前頁對象的列表错敢。
  • 屬性number:返回當(dāng)前是第幾頁翰灾,從1開始。
  • 屬性paginator:當(dāng)前頁對應(yīng)的Paginator對象稚茅。
  • 方法has_next():如果有下一頁返回True纸淮。
  • 方法has_previous():如果有上一頁返回True。
  • 方法len():返回當(dāng)前頁面對象的個數(shù)亚享。

示例

1)在booktest/views.py文件中創(chuàng)建視圖page_test咽块。

from django.shortcuts import render
from django.http import HttpResponse
from django.core.paginator import Paginator
from areatest.models import AreaInfo
# Create your views here.
...
#參數(shù)pIndex表示:當(dāng)前要顯示的頁碼
def page_test(request,pIndex):
    # return HttpResponse(pIndex)
    # 查詢所有的地區(qū)信息
    list1 = AreaInfo.objects.filter(aParent__isnull=True)
    # list1 = AreaInfo.objects.all()
    # 實(shí)例化 將所有地區(qū)信息按一頁10條進(jìn)行分頁
    p = Paginator(list1, 10)
    # 如果當(dāng)前沒有傳遞頁碼信息,則展示第一頁(這樣寫是為了請求第一頁時可以不寫頁碼)
    if pIndex == '':
        pIndex = '1'
    # 通過url匹配的參數(shù)都是字符串類型欺税,轉(zhuǎn)換成int類型
    pIndex = int(pIndex)
    # 獲取第number頁的數(shù)據(jù)
    list2 = p.page(pIndex)
    # 獲取所有的頁碼信息
    plist = p.page_range
    # 將當(dāng)前頁的數(shù)據(jù)侈沪、當(dāng)前頁碼、所有頁碼信息-傳遞到模板中
    return render(request, 'areatest/page_test.html', {'list': list2, 'pIndex': pIndex, 'plist': plist})

2)在booktest/urls.py文件中配置url晚凿。

url(r'^page(?P<pIndex>[0-9]*)/$', views.page_test),

3)在templates/areatest/目錄下創(chuàng)建page_test.html模板文件亭罪。

<!DOCTYPE html>
<html>
<head>
    <title>第{{ pIndex }}頁</title>
</head>
<body>
<h4>顯示當(dāng)前頁的地區(qū)信息:</h4><br>
<ul>
    {% for area in list %}
        <li>{{ area.id }}------>{{ area.atitle }}</li>
    {% endfor %}
</ul>
<hr>
顯示頁碼信息:當(dāng)前頁碼沒有鏈接,其它頁碼有鏈接<br>
{% for pindex in plist %}
    {# 當(dāng)前頁面不允許點(diǎn)擊#}
    {% if pIndex == pindex %}
        {{ pIndex }}&nbsp;&nbsp;
    {% else %}
        <a href="/page{{ pindex }}/">{{ pindex }}</a>&nbsp;&nbsp;
    {% endif %}
{% endfor %}
</body>
</html>

4)運(yùn)行服務(wù)器歼秽,在瀏覽器中輸入如下網(wǎng)址:

http://127.0.0.1:8000/page/

運(yùn)行結(jié)果如下:


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末应役,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子燥筷,更是在濱河造成了極大的恐慌扛吞,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荆责,死亡現(xiàn)場離奇詭異滥比,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)做院,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門盲泛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來濒持,“玉大人,你說我怎么就攤上這事寺滚「逃” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵村视,是天一觀的道長官套。 經(jīng)常有香客問我,道長蚁孔,這世上最難降的妖魔是什么奶赔? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮杠氢,結(jié)果婚禮上站刑,老公的妹妹穿的比我還像新娘。我一直安慰自己鼻百,他們只是感情好绞旅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著温艇,像睡著了一般因悲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勺爱,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天囤捻,我揣著相機(jī)與錄音,去河邊找鬼邻寿。 笑死,一個胖子當(dāng)著我的面吹牛视哑,可吹牛的內(nèi)容都是我干的绣否。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼挡毅,長吁一口氣:“原來是場噩夢啊……” “哼蒜撮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跪呈,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤段磨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耗绿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苹支,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年误阻,在試婚紗的時候發(fā)現(xiàn)自己被綠了债蜜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晴埂。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寻定,靈堂內(nèi)的尸體忽然破棺而出儒洛,到底是詐尸還是另有隱情,我是刑警寧澤狼速,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布琅锻,位于F島的核電站,受9級特大地震影響向胡,放射性物質(zhì)發(fā)生泄漏恼蓬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一捷枯、第九天 我趴在偏房一處隱蔽的房頂上張望滚秩。 院中可真熱鬧,春花似錦淮捆、人聲如沸郁油。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桐腌。三九已至,卻和暖如春苟径,著一層夾襖步出監(jiān)牢的瞬間案站,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工棘街, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蟆盐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓遭殉,卻偏偏與公主長得像石挂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子险污,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容