1.設(shè)置靜態(tài)文件路徑和動態(tài)文件路徑
編輯 settings:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_URL = '/static/uploads/'
MEDIA_ROOT = os.path.join(STATIC_ROOT, "uploads")
動態(tài)文件設(shè)置
MEDIA_ROOT
和 MEDIA_URL
代表的是用戶上傳后的文件保存的地方未状∪虿希可以理解為存放可變文件的文件夾。
這兩個參數(shù)有什么用處呢懂从?
在 Django 的 FileField 和 ImageField 這樣的 Model 類中授段,有 upload_to
參數(shù)可選。當(dāng) upload_to
設(shè)置相關(guān)的地址后番甩,如例子:
models.ImageField(upload_to = 'test_pictures')
文件上傳后將自動保存到: os.path.join(MEDIA_ROOT, upload_to)
侵贵,在本例中就是:/static/uploads/test_pictures
而 MEDIA_URL
,則代表用戶可以通過怎樣的 URL 來訪問這些上傳后的文件資源缘薛。
在本例子中窍育,本機(jī)地址是:http://127.0.0.1/
,MEDIA_URL
設(shè)置為 /static/uploads/
那么通過:http://127.0.0.1//static/uploads/文件名
就可以訪問相關(guān)的上傳圖片或者其他文件宴胧。
靜態(tài)文件設(shè)置
STATIC_ROOT
和 STATIC_URL
則是網(wǎng)站中漱抓,用于網(wǎng)站放置的靜態(tài)圖片、CSS恕齐、JS 等文件的保存地址乞娄。可以理解為显歧,保存網(wǎng)站運(yùn)行中不會再變文件的文件夾(即不會刪除或者新增)
STATIC_URL
补胚,同 MEDIA_URL
類似;設(shè)置 STATIC_URL
為 "/static/"
時候追迟,通過:http://127.0.0.1/static/文件名
就可以訪問相關(guān)的靜態(tài)文件了溶其。
STATIC_ROOT
是一個比較特殊的文件夾。這是 Django 的開發(fā)模式和部署模式區(qū)別最大的地方敦间。
通常我們在開發(fā)模式下瓶逃,可以在我們所在的 project 下建立相應(yīng)的 app, 然后每個 app 下都建立相應(yīng)的 static 文件夾廓块。在開發(fā)模式下(Debug=True)厢绝,Django 將為我們自動查找這些靜態(tài)文件(每個app)并在網(wǎng)頁上顯示出來。然而带猴,在部署模式下昔汉,Django 認(rèn)為這些工作交由 web 服務(wù)器來運(yùn)行會更有效率。
因此拴清,在部署時靶病,我們需要運(yùn)行一下 :
python manage.py collectstatic
這個命令將會把每個 app 里的 static 目錄下的文件 copy 到 STATIC_ROOT 這個文件夾下会通。
如果在部署模式下,即:(Debug=False)
訪問相關(guān)網(wǎng)頁娄周,如: http://127.0.0.1/static/文件名
涕侈,將不會訪問 Django下各個 App 中的 static 文件夾,而是 STATIC_ROOT
中所指定的文件夾煤辨。
為了在部署模式下正確使用裳涛,我們還需要在 urls.py
中添加以下:
from tutorial import settings
from django.conf.urls.static import static
urlpatterns = [
…………
]
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
這相當(dāng)于告訴 Django 碰到一個 "static" 開頭的鏈接時,該如何處理众辨。
2.前端顯示圖片
了解完以上之后端三,我們讓圖片在前端顯示出來。
編寫一個 show 視圖函數(shù)鹃彻,來傳遞動態(tài)圖片:
from myApp.models import Profile
def show(request):
context = {}
pictures = Profile.objects.all()
context['pictures'] = pictures
return render(request, 'show.html', context)
然后編寫 show.html
:
<html>
{% load staticfiles %}
<body>
<p>靜態(tài)文件:</p>
< img src="{% static 'img/jtwj.jpg' %}" %}>
<p>動態(tài)文件:</p>
{% for pic in pictures %}
< img src="/static/uploads/{{ pic.picture }}" %}>
<br><br>
{% endfor %}
</body>
</html>