使用django實現網頁的時候,想要在網頁上顯示圖片是一件比較麻煩的事情。標準的html語言顯示圖片的方法在這裏行不通,須要在配置文件中稍做修改。html
那麼咱們能夠很是天然想到,網頁上的圖片的來源方式有兩種。1種是靜態圖片,即在寫網頁的時候就肯定好頁面上要放那一張圖片。1種是動態圖片,如從數據庫中的查詢獲得的圖片。這兩種顯示圖片的方式稍有不一樣,如下分兩個部分進行說明。sql
寫在前面:我在作的是django是1.8的版本號,在ubuntu環境下寫的。數據庫
1、靜態圖片django
假設咱們如今已經有了一個可運行的網站,網站的結構以下所示:ubuntu
.
├── db.sqlite3
├── image
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ ├── models.py
│ ├── templates
│ │ └── index.html
│ ├── tests.py
│ ├── urls.py
│ ├── views.py
├── manage.py
├── showImg
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
└── static
└── 1.jpg
從上述結構能夠看出,這個項目的名字叫作「showImg」,而APP的名字叫作「image」。至於其餘各個文件的做用我就再也不一一贅述,若是對這些文件還不是很明白的話,建議能夠先從基本的入手。函數
在咱們的主頁面中,index.html文件但願現實static文件夾下面的這個圖片,目前index.html的內容以下:網站
<!-- index.html -->
<html> <head><head> <body> <h1>An Image Test</h1> <img src="/static/1.jpg"> </body> </html>
按照傳統的理解,這個時候圖片是能夠現實的,但在django中,圖片顯示的是一個「×」,圖片沒法顯示出來。url
這是由於按照django處理連接的習慣,每次django遇到一個連接,都會到urls.py中尋找相應的解決方案。而urls.py中也給出各個連接對應的views.py文件中的處理函數,因此這個時候咱們須要修改urls.py文件。固然,這個urls.py文件是image文件夾下的,而不是showImg文件夾下的。spa
# ./image/urls.py
from django.conf.urls import patterns, url from image import views urlpatterns = patterns('', url(r'^$', views.show, name='index'), url(r'^static/(?P<path>.*)', 'django.views.static.serve', {'document_root':'/home/anna/Documents/django_py/showImg/static'}), )
標紅的內容就是要新添加的一行說明,告訴django,當遇到一個「static」開頭的連接時,改如何處理。.net
這個時候,再訪問http://127.0.0.1:8000/image/ 發現,圖片仍是沒法顯示,咱們還須要小小的修改一下index.html中的內容
<!-- index.html --> <html> <head><head> <body> <h1>An Image Test</h1> <img src="static/1.jpg"> </body> </html>
這個地方和前面的代碼有什麼不一樣呢?就是圖片路徑不在是絕對路徑而是相對路徑了(呃,其實我也不知道爲何,我也是嘗試了很久才發現應該是這個樣子的。恩。)
這個時候再訪問http://127.0.0.1:8000/image/就沒問題啦!
而後咱們又會有一個問題,我習慣把圖片放在別的目錄下面,放在根目錄的static下面不符合個人習慣。這個時候再要修改,也就是很是方便的事情了。
.
├── db.sqlite3
├── image
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ ├── models.py
│ ├── templates
│ │ └── index.html
│ ├── pic
│ │ └── 1.jpg
│ ├── tests.py
│ ├── urls.py
│ ├── views.py
├── manage.py
├── showImg
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
└── static
└── 1.jpg
好比說將圖片放在image/pic/目錄下,那麼這個是咱們首先修改urls.py文件的內容。
# ./image/urls.py from django.conf.urls import patterns, url from image import views urlpatterns = patterns('', url(r'^$', views.show, name='index'), url(r'^image/pic/(?P<path>.*)', 'django.views.static.serve', {'document_root':'/home/anna/Documents/django_py/showImg/image/pic'}), )
注意到綠色高亮的部分,就是把原先的「static」所有都換成了新的路徑。相應的,index.html文件也是同樣的處理方式。
<!-- index.html --> <html> <head><head> <body> <h1>An Image Test</h1> <img src="image/pic/1.jpg"> </body> </html>
這樣再訪問http://127.0.0.1:8000/image/就也能夠了
固然,所謂同樣通樣樣通,萬變不離其宗,爲了保證接口的一致性,咱們也能夠保留static關鍵字,而只修改圖片的位置。這個時候的代碼以下:
# ./image/urls.py from django.conf.urls import patterns, url from image import views urlpatterns = patterns('', url(r'^$', views.show, name='index'), url(r'^static/(?P<path>.*)', 'django.views.static.serve', {'document_root':'/home/anna/Documents/django_py/showImg/image/pic'}), )
<!-- index.html --> <html> <head><head> <body> <h1>An Image Test</h1> <img src="static/1.jpg"> </body> </html>
發現其中的不一樣了嗎?這樣也是能夠的哦。
=========================
上面的方法基本能夠知足咱們的須要啦,可是由於種種緣由,咱們選擇另外一種方法來解決這個問題。
仍是從最基本的提及,項目結構以下,圖片在static文件夾下。
.
├── db.sqlite3
├── image
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ ├── models.py
│ ├── templates
│ │ └── index.html
│ ├── tests.py
│ ├── urls.py
│ ├── views.py
├── manage.py
├── showImg
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
└── static
└── 1.jpg
首先須要在showImg/settings.py文件中加一句話
# showImg/settings.py
STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static').replace('\\', '/'), )
紅色的就是添加的話,不用作任何改動(前提是圖片在static文件夾下)。而後再修改index.html的內容:
<!-- index.html --> <html> <head><head> <body> <h1>An Image Test</h1>
{% load staticfiles %} <img src="{% static"1.jpg"%}"> </body> </html>
着重要修改的內容如紅色高亮。這裏須要注意的是,img的src的內容中,1.jpg的先後是不能要空格的,不然圖片的路徑將會是錯誤的。
<img src="{% static"1.jpg "%}">
好比上述代碼,這樣的圖片路徑是有錯誤的。
若是你們發現圖片沒法顯示的話,能夠用「審查元素」看一下圖片的路徑是否正確,正確的圖片路徑應該是:
<img src="/static/1.jpg">
相應的,若是你們不習慣把圖片的內容放到static文件夾下面的話,這裏只用改一處就能夠了:
# showImg/settings.py STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'image/pic').replace('\\', '/'), )
而後在index.html文件中,仍是使用static來訪問圖片。
2、動態圖片
動態圖片的處理過程與靜態圖片沒有根本上的區別。咱們仍是承接上面的例子來思考,若是用戶上傳的動態圖片就是存儲在/static文件夾下面的,咱們怎麼辦呢?
. ├── db.sqlite3 ├── image │ ├── admin.py │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ ├── models.py │ ├── templates │ │ └── index.html │ ├── tests.py │ ├── urls.py │ ├── views.py ├── manage.py ├── showImg │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ ├── wsgi.py └── static └── 1.jpg
如今咱們假設前面的靜態圖片的目的已經成功了,只不過如今新添加了一個功能,是上傳圖片,並將圖片存儲在/static文件夾下。
這時候咱們天然想到,要將上傳的圖片顯示到網頁上,首先要從視圖層(views.py)中將要顯示的圖片信息傳給網頁,假設圖片信息是圖片名稱,即本例中的「1.jpg」,那麼views.py的部分代碼爲:
# views.py return render_to_response('index.html', {'images':'1.jpg'})
當把要顯示的圖片傳遞給網頁後,index.html的代碼就有所改變了:
<!-- index.html --> <html> <head><head> <body> <h1>An Image Test</h1> {% load staticfiles %} <img src="{% static images %}"> </body> </html>
改變只如紅色高亮部分,將原來的具體的圖片名稱改爲了傳遞過來的內容指代。固然,若是在views.py中傳遞過來的圖片不僅1張的話,即:
# views.py return render_to_response('index.html', {'images':['1.jpg', '2.jpg']})
如上述代碼,傳遞的是一個list,index.html採用上面的代碼是沒法正確顯示出圖片的。經過審查元素看到的圖片的url是亂碼,這個時候咱們就要循環顯示圖片了:
<!-- index.html --> <html> <head><head> <body> <h1>An Image Test</h1> {% load staticfiles %}
{% for img in images %} <img src="{% static img %}">
{% endfor %} </body> </html>
這個時候必須如上述代碼中循環顯示圖片才能正確顯示。
===========================
好了,到這裏咱們已經分別講述瞭如何顯示靜態和動態的圖片了。可是若是當一個網站裏面同時包含靜態和動態的圖片的話,就仍是須要使用不一樣的指代方式——「static」和「media」。static的內容咱們已經講過了,若是是動態圖片的話,media如何使用:
# settings.py MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\','/') MEDIA_URL = '/media'
在settings.py中加入如上內容。而後修改online/models.py中的內容,將上傳的圖片顯示到media文件夾下
# online/models.py class Image(models.Model): headImg = models.FileField(upload_to = '.')
其中標紅處的文件路徑是比較關鍵的。這裏只寫一個當前路徑,而再也不寫文件夾的名稱,是由於在settings.py文件中已經指定了上傳文件的位置,就是在/media 文件夾下,因此這裏不用再指定了。若是在這裏寫成
# online/models.py class Image(models.Model): headImg = models.FileField(upload_to = './media')
就會發現,上傳的圖片實際上是保存在/media/media文件夾下面的。
這時,再將圖片信息傳遞給頁面,讓頁面顯示,就能夠了:
<!-- index.html --> <html> <head><head> <body> <h1>An Image Test</h1> {% load staticfiles %} {% for img in images %} <img src="{% static img %}"> {% endfor %} </body> </html>
注意,這裏依然用static做爲關鍵字,而不由於是動態文件就用media之類的。
Bon Appetite!