如何在 Django 模板中引用本地媒体文件

uwa*_*345 5 python django django-templates

我已经设置了媒体根目录、媒体网址等,因此当我致电时该文件会显示

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

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

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

那么我必须在模板中添加什么内容?我试过

<object data="{{ MEDIA_URL }}{{ pdf }}">something</object>
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

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

有两个问题同时发生。

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

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

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


Dan*_*ram 0

According to your code it doesn't look like MEDIA_URL is defined in your views context.

from django.conf import settings

def test_doc(request):`
    p = r'something/somewhere/my_pdf.pdf'`
    return render(request, 'documents/test.html', {'pdf':p, 'MEDIA_URL': settings.MEDIA_URL})
Run Code Online (Sandbox Code Playgroud)