我已经有很多天了,所有提供的解决方案还没有帮助我。如果我使用模板变量{{userprofile.photo.url}}(结果是alt文本),我要显示的图像配置文件将不会显示,但是当我将像这样的图像的路径放置时,它确实可以工作:/仪表板/媒体/仪表板/photo/profils/user.png。
我试图调试,看来URL很好,但给出的结果是:
[27/Nov/2017 13:55:07] "GET /dashboard/ HTTP/1.1" 200 44757
Not Found: /media/dashboard/photos/profils/user.png
[27/Nov/2017 13:55:07] "GET /media/dashboard/photos/profils/user.png HTTP/1.1" 404 2295
这里的文件:
项目的结构:
project_dir/
dash-app/
__init__.py
settings.py
urls.py
wsgi.py
dashboard/
__init__.py
admin.py
app.py
forms.py
models.py
urls.py
views.py
...
templates/
dashboard/
index.html
...
static/
dashboard/
images/
logo9.png
...
media/
dashboard/
photos/
profils/
user.png
...
在urls.py上:
from django.conf.urls import url
from dashboard import models
from dashboard import views
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
url(r'^$', views.index, name='index'),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
在settings.py上:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
STATIC_ROOT = os.path.join(BASE_DIR, "dashboard", "static")
#dashboard/media/
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "dashboard", "media", "dashboard")
在型号上:
from django.core.files.storage import FileSystemStorage
image_storage = FileSystemStorage(
# Physical file location ROOT
location='{0}/'.format(settings.MEDIA_ROOT),
# Url for file
base_url='{0}/dashboard/'.format(settings.MEDIA_URL),
)
def image_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/dashboard/picture/<filename>
return 'photos/profils/{0}'.format(filename)
def logo_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/dashboard/picture/<filename>
return 'photos/logos/{0}'.format(filename)
...
# Photos
photo = models.ImageField(blank=True,
upload_to=image_directory_path,
storage=image_storage)
# Logo de l'activité
photo = models.ImageField(null=True,
upload_to=logo_directory_path,
storage=image_storage)
在Views.py上:
def index(request):
connected = models.UserProfile.objects.get(user=request.user)
print(connected.photo.url)
context={
'userprofile':connected,
}
return render(request, 'dashboard/index.html', context)
在index.html上:
<!-- menu profile quick info -->
<div class="profile clearfix">
<div class="profile_pic">
{% if userprofile.photo %}
<img src="{{ userprofile.photo.url }}" alt="User" class="img-circle profile_img">
{% else %}
<img src="media/dashboard/photos/profils/user.png" alt="..." class="img-circle profile_img">
{% endif %}
</div>
<div class="profile_info">
<span>Bienvenu,</span>
<h2>{{ userprofile }}</h2>
</div>
</div>
<!-- /menu profile quick info -->
我正在使用Python 3和Django 1.11.5感谢Tou的帮助!
编辑:我已经在私人导航上打开了该应用程序以重新加载,看看是否有缓存上的某个问题,并且知道我发现什么都不可用,也不可用:
{{ userprofile.photo.url|slice:"1:" }}
或media/dashboard/photos/profils/user.png
。是否可以重新加载>媒体的文件链接到该项目或类似的内容。因为如果将图像手动添加到文件夹或通过Django管理员接口上传,是否有区别?已解决:我更改了以下行:
MEDIA_ROOT = os.path.join(BASE_DIR, "dashboard", "media", "dashboard")
至MEDIA_ROOT = os.path.join(BASE_DIR, "dashboard", "media")
image_storage = FileSystemStorage( # Physical file location ROOT location='{0}/'.format(settings.MEDIA_ROOT), # Url for file base_url='{0}/dashboard/'.format(settings.MEDIA_URL), )
to
image_storage = FileSystemStorage( # Physical file location ROOT location='{0}/dashboard/'.format(settings.MEDIA_ROOT), # Url for file base_url='{0}/dashboard/'.format(settings.MEDIA_URL), )
在模型上定义一个将相对URL返回媒体文件的计算属性。
class CustomUser(models.Model):
...
@property
def photo_url(self):
return '{}{}'.format(settings.MEDIA_URL, self.img)
然后在模板中使用此计算的属性:
{% if userprofile.photo %}
<img
src="{{ userprofile.photo_url }}"
alt="User"
class="img-circle profile_img"
>
{% else %}
如果您正在开发中运行,则可以在项目URL中注册媒体文件的路线:
urlpatterns = [
...
] + static.static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
否则,请考虑将媒体文件上传到诸如Amazon S3之类的数字资产管理系统或编写服务器规则以服务您的资产。
已解决:
我更改了这些行: MEDIA_ROOT = os.path.join(BASE_DIR, "dashboard", "media", "dashboard")
到 MEDIA_ROOT = os.path.join(BASE_DIR, "dashboard", "media")
image_storage = FileSystemStorage(
# Physical file location ROOT
location='{0}/'.format(settings.MEDIA_ROOT),
# Url for file
base_url='{0}/dashboard/'.format(settings.MEDIA_URL),
)
to
image_storage = FileSystemStorage(
# Physical file location ROOT
location='{0}/dashboard/'.format(settings.MEDIA_ROOT),
# Url for file
base_url='{0}/dashboard/'.format(settings.MEDIA_URL),
)