首页 > 解决方案 > 如何在 Django 模板中引用本地媒体文件

问题描述

我已经设置了我的媒体根、媒体 url 等,所以当我打电话时文件会显示出来

http://127.0.0.1:8000/media/something/somewhere/my_pdf.pdf

现在我想在模板中显示相同的文件(即对象中的 PDF 或嵌入标签以及其他一些内容。我将路径传递给文件(即视图上下文中“媒体”之后的所有内容,例如:

def test_doc(request):`
    p = r'something/somewhere/my_pdf.pdf'`
    return render(request, 'documents/test.html', {'pdf':p})

那么我必须在我的模板中添加什么?我试过了

<object data="{{ MEDIA_URL }}{{ pdf }}">something</object>

及其许多变体。我究竟做错了什么?

标签: pythondjangodjango-templates

解决方案


我测试了你的方法,我相信我能够重现你的问题。

  • PDF 从地址显示在浏览器中:http: //127.0.0.1 :8000/myapp/media/myapp/my_pdf.pdf
  • <object data="{{ MEDIA_URL }}{{ pdf }}"></object>使用模板加载到对象中时不显示 PDF
  • <object data="{% get_media_prefix %}{{ pdf }}">使用模板加载到对象中时不显示 PDF

有两个问题同时出现。

  1. Django 的默认项目设置使用 X-Frame-Options启用点击劫持保护。这不会阻止通过直接请求加载媒体文件,但是当您尝试将媒体加载到对象中时会这样做。Firefox Inspector 显示错误消息:设置为“DENY”的“X-Frame-Options”指令拒绝在框架中加载“http://127.0.0.1:8000/myapp/media/myapp/my_pdf.pdf” .

Django 的文档告诉使用@xframe_options_exempt装饰器的视图。它对我的测试没有帮助。通过在 settings.py 中注释掉“django.middleware.clickjacking.XFrameOptionsMiddleware”来禁用点击劫持保护允许我<object data="media/myapp/my_pdf.pdf">在模板中的对象中显示 PDF。

  1. {{ MEDIA_URL }}{{ pdf }}模板中的和标记都{% get_media_prefix %}{{ pdf }}导致从磁盘加载 PDF,路径为“/media/myapp/my_pdf.pdf”。注意开头多余的“/”。p = 'media/myapp/my_pdf.pdf'您可以通过在视图中定义并<object data="{{ pdf }}">在模板中使用来防止这种情况。不是很优雅,但在禁用点击劫持中间件时有效。

推荐阅读