1.设置静态文件路径和动态文件路径
编辑 settings:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_URL = '/static/uploads/'
MEDIA_ROOT = os.path.join(STATIC_ROOT, "uploads")
动态文件设置
MEDIA_ROOT
和 MEDIA_URL
代表的是用户上传后的文件保存的地方。可以理解为存放可变文件的文件夹。
这两个参数有什么用处呢?
在 Django 的 FileField 和 ImageField 这样的 Model 类中,有 upload_to
参数可选。当 upload_to
设置相关的地址后,如例子:
models.ImageField(upload_to = 'test_pictures')
文件上传后将自动保存到: os.path.join(MEDIA_ROOT, upload_to)
,在本例中就是:/static/uploads/test_pictures
而 MEDIA_URL
,则代表用户可以通过怎样的 URL 来访问这些上传后的文件资源。
在本例子中,本机地址是:http://127.0.0.1/
,MEDIA_URL
设置为 /static/uploads/
那么通过:http://127.0.0.1//static/uploads/文件名
就可以访问相关的上传图片或者其他文件。
静态文件设置
STATIC_ROOT
和 STATIC_URL
则是网站中,用于网站放置的静态图片、CSS、JS 等文件的保存地址。可以理解为,保存网站运行中不会再变文件的文件夹(即不会删除或者新增)
STATIC_URL
,同 MEDIA_URL
类似;设置 STATIC_URL
为 "/static/"
时候,通过:http://127.0.0.1/static/文件名
就可以访问相关的静态文件了。
STATIC_ROOT
是一个比较特殊的文件夹。这是 Django 的开发模式和部署模式区别最大的地方。
通常我们在开发模式下,可以在我们所在的 project 下建立相应的 app, 然后每个 app 下都建立相应的 static 文件夹。在开发模式下(Debug=True),Django 将为我们自动查找这些静态文件(每个app)并在网页上显示出来。然而,在部署模式下,Django 认为这些工作交由 web 服务器来运行会更有效率。
因此,在部署时,我们需要运行一下 :
python manage.py collectstatic
这个命令将会把每个 app 里的 static 目录下的文件 copy 到 STATIC_ROOT 这个文件夹下。
如果在部署模式下,即:(Debug=False)
访问相关网页,如: 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)
这相当于告诉 Django 碰到一个 "static" 开头的链接时,该如何处理。
2.前端显示图片
了解完以上之后,我们让图片在前端显示出来。
编写一个 show 视图函数,来传递动态图片:
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>静态文件:</p>
< img src="{% static 'img/jtwj.jpg' %}" %}>
<p>动态文件:</p>
{% for pic in pictures %}
< img src="/static/uploads/{{ pic.picture }}" %}>
<br><br>
{% endfor %}
</body>
</html>