【问题标题】:Django: Template Tag unable to load image.Only reading media imageDjango:模板标签无法加载图像。仅读取媒体图像
【发布时间】:2016-11-21 15:48:51
【问题描述】:

我正在尝试使用 django pisa 模块生成 PDF。

views.py

​​>
def reportPdf(template_src, context_dict):

        template = get_template(template_src)
        context = Context(context_dict)
        htmlRender = template.render(context)
        resultObj = StringIO.StringIO()
        pdfObject = pisa.pisaDocument(StringIO.StringIO(htmlRender.encode(
            'utf-8')), resultObj,link_callback=fetch_resources)
        response = HttpResponse(resultObj.getvalue(), content_type = 'application/pdf')
        response["Content-Disposition"] = 'inline;filename=sample.PDF'
        return response
 def fetch_resources(uri, rel):
         import project.settings
         path = os.path.join(project.settings.MEDIA_ROOT, uri.replace(
                                            project.settings.MEDIA_URL, ""))
         return path

class abc():
     def get(self,request, *args, **kwargs):
     // some code
     return reportPdf('pdf.djhtml',{'pagesize': 'A4',"refer_data":detail}

settings.py:

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))
MEDIA_ROOT = os.path.realpath(os.path.join(PROJECT_PATH, "media"))
MEDIA_URL = '/media/'

模板:

pdf.djhtml: 媒体文件夹中可用的图像代码:

<img src="/media/sample.jpg"/>

上面工作正常,因为我在views.py中合并了媒体

但下面的代码不会加载图像。

refer_data.image.url = http://www.w3schools.com/images/w3schools_green.jpg(将此 http url 视为测试示例)。我从 API 调用中获取此图像 url。

 {% if refer_data.image.url != "" %}
        <img src="{{refer_data.image.url}}"/>
 {% else %}
       <img src="noimage.png"/>

 {% endif %}

有人可以分析并分享我在哪里失踪的想法吗? 任何帮助将不胜感激。

【问题讨论】:

  • 你应该传递图片的绝对网址
  • @trinchet...我没听明白。请问如何传递图片的绝对网址?真的很有帮助
  • 当您执行{{refer_data.image.url}} 时,您会得到类似/images/w3schools_green.jpg 而不是完整路径http://www.w3schools.com/images/w3schools_green.jpg 因此,您应该使用域名等前缀。
  • 当我做 {{refer_data.image.url}} 然后我得到完整路径w3schools.com/images/w3schools_green.jpg。这会造成混乱,例如如何传递绝对网址。请您详细说明一下
  • @trinchet ..虽然它加载了 url 的完整路径但没有加载图像。当我在 views.py 中注释掉 fetch_resources 方法时,它会加载图像。

标签: django image django-templates pisa


【解决方案1】:

您可以检查您是在处理fetch_resources 中的本地还是绝对HTTP URL,使用validator 包的示例:

import project.settings
import validators

def fetch_resources(uri, rel):
    if validators.url(uri):
      return uri
    else:
      path = os.path.join(project.settings.MEDIA_ROOT, uri.replace(
                                            project.settings.MEDIA_URL, ""))
      return path

对于绝对 url (http://www.google.com),返回 url,否则对于相对 url /media/myimage.jpg,它返回连接的媒体路径。

【讨论】:

  • Hay Marcs。你的答案是完美的。因为我必须使用验证器模块中的 URLValidator 函数......我可以解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2011-05-28
  • 2012-01-26
  • 2013-12-23
  • 2014-10-29
  • 2021-11-03
相关资源
最近更新 更多