Django不提供用户在heroku上上载的媒体文件

Django不提供用户在heroku上上载的媒体文件,django,heroku,Django,Heroku,我尝试了所有的方法,但不知何故我看不到用户上传的图片。我在heroku上部署了代码,并且每个静态文件都被正确加载。用户甚至要更正映像的路径,但不知何故,服务器显示了找不到映像的错误 Settings.py # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.8/howto/static-files/ STATIC_ROOT = os.path.join(PROJECT_ROOT, 'st

我尝试了所有的方法,但不知何故我看不到用户上传的图片。我在heroku上部署了代码,并且每个静态文件都被正确加载。用户甚至要更正映像的路径,但不知何故,服务器显示了找不到映像的错误

Settings.py
 # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/

STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = '/static/'

# Extra places for collectstatic to find static files.
#STATICFILES_DIRS = (
#    os.path.join(PROJECT_ROOT, 'static'),
#)

STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static'),
)

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

Models.py
#this is for photos upload by user
class You(models.Model):
    user = models.ForeignKey(User,null=True)
    name=models.CharField(max_length=30,blank=True,default='pictures/videos')
    docfile = models.FileField(upload_to='documents/%Y/%m/%d', null=True,blank=True)

    def __unicode__(self):
        return self.user.username

#Views.py(To upload files)
@login_required
def upload(request):

    if request.method == 'POST':

        newdoc = You(docfile = request.FILES['file'],user=request.user)
        newdoc.save()
        msg='dee'
            # Redirect to the document list after POST
        return HttpResponse(json.dumps({'message': msg}))

    else:
        form = DocumentForm()



    # Render list page with the documents and the form
    return render(request,'mat_upload.html',{'form':form})

Template(gallery.html)
{% for document in documents %}
<img class="img-responsive" src="{{MEDIA_URL}}/media/{{ document.docfile }}" alt="hiiii" style="max-width: 100%;
    height: 250px;" />
{% endfor %}

@login_required
def gallery(request):
    documents =  You.objects.filter(user=request.user)

    return render(request,'gallery.html',{'documents': documents,})
Urls.py
from django.conf.urls import include, url

from django.contrib import admin

from django.conf import settings
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.views.generic import RedirectView
admin.autodiscover()

import harpoons.views


urlpatterns = [

    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('harp.urls')),
    url(r'^password_reset_recover/', include('password_reset.urls')),
    url(r'^accounts/', include('allauth.urls')),




]
Settings.py
#静态文件(CSS、JavaScript、图像)
# https://docs.djangoproject.com/en/1.8/howto/static-files/
STATIC\u ROOT=os.path.join(PROJECT\u ROOT,“staticfiles”)
静态URL='/STATIC/'
#collectstatic查找静态文件的额外位置。
#静态文件\u目录=(
#join(PROJECT_ROOT,'static'),
#)
静态文件\u目录=(
join(PROJECT_ROOT,'static'),
)
MEDIA\u ROOT=os.path.join(基本目录'MEDIA')
媒体URL='/MEDIA/'
Models.py
#这是供用户上传照片
为您上课(models.Model):
user=models.ForeignKey(user,null=True)
name=models.CharField(max_length=30,blank=True,默认值为=“图片/视频”)
docfile=models.FileField(上传到class='documents/%Y/%m/%d',null=True,blank=True)
def ___; unicode(自):
返回self.user.username
#Views.py(用于上载文件)
@需要登录
def上传(请求):
如果request.method==“POST”:
newdoc=You(docfile=request.FILES['file'],user=request.user)
newdoc.save()
msg='dee'
#POST后重定向到文档列表
返回HttpResponse(json.dumps({'message':msg}))
其他:
form=DocumentForm()
#使用文档和表单呈现列表页面
返回呈现(请求,'mat_upload.html',{'form':form})
模板(gallery.html)
{文档%中的文档为%}
{%endfor%}
@需要登录
def库(请求):
documents=You.objects.filter(用户=request.user)
返回呈现(请求,'gallery.html',{'documents':文档,})
url.py
从django.conf.url导入包括
从django.contrib导入管理
从django.conf导入设置
从django.conf.url.static导入静态
从django.contrib.staticfiles.url导入staticfiles\u urlpatterns
从django.views.generic导入重定向视图
admin.autodiscover()
导入鱼叉视图
URL模式=[
url(r“^admin/”,包括(admin.site.url)),
url(r'^',包括('harp.url'),
url(r“^password\u reset\u recover/”,包括('password\u reset.url'),
url(r“^accounts/”,包括('allauth.url'),
]

您无法将用户上传的文件保存在Heroku本地。文件系统是短暂的,不会在dyno重新启动期间或并发dyno之间持续存在。你需要把它们上传到更永久的地方;一个流行的选择是Amazon S3,有很多库可以为您提供这些功能。

您是否使用python manage.py collectstatic?@alejosocorro是的,我使用了collectstatic。问题是由用户上传的媒体文件。它们正在被上传,但当我打开它们时django抛出错误,即使位置似乎正确。谢谢Daniel,但我仍然应该看到图像,直到dyno运行,只有在您实际配置了从/media/为其服务的内容时。WhiteNoise,您可能正在使用它来服务静态资产,默认情况下只服务于静态URL。