我正在尝试在heroku上部署django应用。我目前正在使用软件包django-heroku作为标准设置。在我的模型下,一些使用ImageField上传的媒体文件,我希望它们显示在模板中。但是,尽管它们似乎指向正确的目的地,但它们并未得到投放。
我已经在SO中找到了类似的问题,并在git官方仓库中查找了示例,但是没有找到使用相同配置的示例。
settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
.
.
.
django_heroku.settings(locals())
模板
{% extends 'base_site.html' %}
{% load i18n %}
{% block content_title %}{% trans 'Manage Product Detail' %}{% endblock%}
{% block content %}
<div class="card">
<div class="carousel-inner" role="listbox">
{% for figure in product.figures.all %}
<div class="item{% if forloop.first %} active{% endif %}">
<img src="{{ figure.image.url }}">
</div>
{%endfor%}
</div>
<div class="card-body">
<h5 class="card-title">{{ product.name }}</h5>
<p class="card-text">{{ product.description }}}
</div>
<div class="card-footer">
<h5 class="card-title">{{ product.name }}</h5>
<p class="card-text">{{ product.description }}}
</div>
</div>
{% endblock %}
尽管我可以确认媒体文件夹,子文件夹和图像存在(在我项目的根目录中)并且该对象存在于模板中,但仍然出现以下404错误:
Not Found: /media/images/Screenshot_from_2018-12-26_21-07-01.png
[04/Jan/2019 14:32:34] "GET /media/images/Screenshot_from_2018-12-26_21-07-01.png HTTP/1.1" 404 2863
答案 0 :(得分:0)
django-heroku软件包无法立即提供此功能(由于heroku方面的限制,不可能实现媒体文件的无缝部署和开发)。在开发中,必须通过以下方式加载媒体文件:
urlpatterns = [
....
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
在生产中,静态文件(如上面提到的某些用户)必须从外部来源提供。以下是我目前关注的提示:https://djangobook.com/serving-files-production/
答案 1 :(得分:0)
我只想进一步解释别人一直在说安德烈无法理解的话。部署项目时,这些媒体文件不存在-使用该应用程序时会添加它们,并且仅在此期间可用。当dyno进入睡眠状态时,您的应用程序或多或少地被重新部署(所有内容都重新安装以供使用),并且与您首次部署它的方式完全相同-无需媒体文件。
答案 2 :(得分:0)
请按照以下步骤操作:
将Cloudinary插件添加到您的Heroku应用。
单击cloudinary并安装它。
然后单击Cloudinary插件。
在此信息中心中,您将可以查看要连接的凭据。
然后转到您的项目:
pip install django-cloudinary-storage
pip install cloudinary
pip install Pillow
INSTALLED_APPS = [
'django.contrib.staticfiles',
'cloudinary_storage',
'cloudinary',
]
CLOUDINARY_STORAGE = {
'CLOUD_NAME': 'your_cloud_name',
'API_KEY': 'your_api_key',
'API_SECRET': 'your_api_secret'
}
MEDIA_URL = '/media/' # or any prefix you choose
DEFAULT_FILE_STORAGE='cloudinary_storage.storage.MediaCloudinaryStorage'
在models.py中:
10。
class TestModel(models.Model):
name = models.CharField(max_length=100)
image = models.ImageField(upload_to='images/',
blank=True)
<img src="{{ test_model_instance.image.url }}" alt="{{
test_model_instance.image.name }}">
...
cloudinary==1.17.0
django-cloudinary-storage==0.2.3