我在使用static
标签显示图像时遇到问题。
我有一个名为的类ProfileView
,当我在登录表单上登录时会采取行动。该类检查即将登录的用户的个人资料数据并将其显示在其主页上,例如姓名、用户名、照片等数据。
class ProfileView(LoginRequiredMixin, TemplateView):
template_name = 'profile.html'
def get_context_data(self, **kwargs):
self.request.session['Hi'] = True
context = super(ProfileView, self).get_context_data(**kwargs)
is_auth = False
name = None
#Pregunto si en el request va el user
user = self.request.user
#Indago sobre los posibles casos, falta hacer cuando un user sea paciente y medico
if user.is_medical:
#if self.request.user.is_authenticated():
print (user.is_medical)
is_auth = True
profile=user.get_medical_profile()
#name = self.request.user.username
data = {
'is_auth':is_auth,
'profile':profile,
}
context.update({'userprofile':profile, 'data':data})
elif user.is_patient:
print (user.is_patient)
is_auth=True
profile=user.get_patient_profile()
data = {
'is_auth':is_auth,
'profile':profile,
}
context.update({'userprofile':profile,'data':data})
elif user.is_physiotherapist:
print (user.is_physiotherapist)
is_auth=True
profile=user.get_physiotherapist_profile()
data = {
'is_auth':is_auth,
'profile':profile,
}
context.update({'userprofile':profile,'data':data})
return context
def get_userprofile(self):
return self.request.user.userprofile
我的设置配置如下:
我有一个名为 base.py 的设置,相对于静态文件,我有以下内容(DEBUG 指令不在此 settings/base.py 中):
一般来说,我说我的静态文件将集中在一个名为的目录中,static
这要归功于STATIC_URL='/static/'
然后STATICFILES_DIRS
我说要static
在创建项目时在每个应用程序或由 Django 创建的主应用程序中命名的目录中查找静态文件。
# settings/base.py
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_URL = '/static/'
# With this configuration, Django will look for static files in a folder named static inside each app and into the neurorehabilitation/static folder created.
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
我有一个名为 development.py 的设置,它继承自 base.py 并具有以下配置:请注意,我 DEBUG=TRUE
在此 settings/development.py 中有
我读过它DEBUG
应该在False
你想要缓存静态文件时打开,虽然我不知道它是否也在你想从开发环境中提供服务时打开。
同样在这settings/development.py
我有一个指令,MEDIA_ROOT
通过它我告诉 Django 当我上传一个文件时,它被保存在一个名为“媒体”的目录中。
该指令MEDIA_URL
表明文件(图像、声音、视频)将从该 url 提供/media/
# settings/development.py
from .base import *
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': get_env_variable('DATABASE_NAME'),
'USER': get_env_variable('DATABASE_USER'),
'PASSWORD': get_env_variable('DATABASE_PASSWORD'),
'HOST': 'localhost',
'PORT': '5433',
}
}
MEDIA_URL = '/media/'
#Cuando suba los archivos de media (imagenes sonido, video), van a servirse
#desde ese url.
MEDIA_ROOT = os.sep.join(os.path.abspath(__file__).split(os.sep)[:-2] + ['media'])
#Ahí le estamos diciendo que donde este, en la carpeta media, cree los
#elementos. Esto creara una carpeta media en el proyecto cuando subamos
#un archivo+
在我的模板profile.html
中,我通过调用 photo 属性来调用图像,该属性是一个类型字段ImageField
,由于在前面显示的视图中它是在上下文中发送的,所以它会转到模板。
figure
我打算在标签内调用图像,如下所示:
{% load static from staticfiles %}
这里是我模板的所有内容profile.html
{% extends 'base.html' %}
<!-- {% load staticfiles %} -->
{% block content %}
<div>
{% if userprofile %}
{{ userprofile.user.username }}, <a href="{% url 'logout' %}">Logout</a>
{% else %}
<a href="">Login</a>
{% endif %}
</div>
<div style=" ">
<figure style=" ">
{% load static from staticfiles %}
<img src="{% static '/media/{{ userprofile.user.photo }}' %}" alt="{{ userprofile.user.username }}">
<!-- <img src="/media/{{ userprofile.user.photo }}" alt="{{ userprofile.user.username }}"> -->
<figcaption>{{ userprofile.user.first_name }}</figcaption>
<!-- User esta relacionado 1 a 1 con userprofile model, por transitividad se llega
al campo username del modelo user desde userprofile-->
</figure>
</div>
{% endblock content %}
这就是我在浏览器中没有显示图像的方式,而是与刚刚登录的用户的姓名和用户名相关的信息
在我的 Django 服务器日志中,我得到了这个:
[28/Dec/2015 08:14:58] "GET /accounts/profile/ HTTP/1.1" 200 5467
Not Found: /media/{{ userprofile.user.photo }}
[28/Dec/2015 08:14:58] "GET /media/%7B%7B%20userprofile.user.photo%20%7D%7D HTTP/1.1" 404 1885
当我不使用标签static
而是以传统方式调用图像时,也就是说以这种方式:
<img src="/media/{{ userprofile.user.photo }}" alt="{{ userprofile.user.username }}">
我想调用的图像出现在那里。
我可能缺少什么配置?或者我可以忽略或忽略什么?
无论如何,我计划在短时间内做的事情是将我的文件集中起来collectstatic
,并将它们放在像 Amazon S3 这样的 CDN 上或来自 NGINX 的服务器上。但在开发的那一刻,我想像这样与他们一起工作。
我不知道可能缺少什么。
当您想显示用户上传的文件时,您必须使用
url
file 属性,如下所示:不要将它们
static
与混淆media
,第一个是用于您的 JavaScript 文件、CSS 等;第二个是用户上传的文件。也就是说,您不需要使用{% load static from staticfiles %}
.如果您已经正确定义了上传文件的路径,那么在该路径中使用是没有意义
/media/
的,即使这是正确的,您也会反对DRY,因为这已经在您的设置中定义,正确的做法将使用{{ MEDIA_URL }}
.