Django中不显示媒体文件

toe95027  于 2023-06-25  发布在  Go
关注(0)|答案(3)|浏览(139)

我正在尝试在网页上显示用户上传的图像。当我使用Django管理界面上传图像文件时(我为图库图像创建了一个filefield模型),图像被正确地存储在/media/images中。我在www.example.com中设置了如下媒体设置settings.py:

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

项目urls.py:

from django.conf.urls import include, url
from django.contrib import admin
import gallery.views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('gallery.urls')),
]+ static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

图库urls.py:

from django.conf.urls import url
from django.conf import settings
from django.conf.urls.static import static
from . import views

urlpatterns = [
url(r'^', views.homepage, name = 'home'),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

图库views.py:

def homepage(request):
    texts = Sitetext.objects.all()
    gal = Galleryimg.objects.all()
    gal.order_by('position')

return render(request,'index.html', {"text1":texts[0].text,"text2":texts[1].text,"text3":texts[2].text,"text4":texts[3].text,"title1":texts[0].title,"title2":texts[1].title,"title3":texts[2].title,"title4":texts[3].title,"gallery":gal})

然后这是访问图像的模板代码的一部分:

{% for g in gallery %}
    <div class="col-md-3 col-sm-4 col-xs-6">
        <img class="img-responsive" src="g.imgfile.url" />
    </div>
{% endfor %}

当我创建一个图库图像时,弹出一个损坏的图像,但该图像无法正确访问。

yrwegjxp

yrwegjxp1#

我这样做,我就可以从Django开发服务器提供媒体文件:

urlpatterns += [
    url(r'^media/(?P<path>.*)$', django.views.static.serve, {
    'document_root': settings.MEDIA_ROOT}),]

只需将其包含在项目urls.py中就足够了。
您的问题可能是您在www.example.com中输入的媒体URLurls.py不正确。您似乎与媒体文件的实际URL不匹配,该文件可能类似于/media/something.png。你似乎只是在/media/上取得资格。我还认为你的正则表达式应该是^media/,而不是/media/

fhity93d

fhity93d2#

1.从gallery.urls文件中删除static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)部分。
1.将src="g.imgfile.url"替换为src="{{ g.imgfile.url }}"

  • 附带问题:* 为什么要将这个大字典({"text1":texts[0].text,...)传递到模板中?这是容易出错和不好的做法。你应该只传递'texts': texts,然后在你的模板中用{% for text in texts %} forloop迭代它们。因此,render方法应该类似于render(request, 'index.html', {'texts': texts, 'gallery': gal})
9o685dep

9o685dep3#

同时确保你没有一个通配符URL模式,它会覆盖其他应用程序中的媒体URL /media/。

相关问题