【问题标题】:can't access image url from template, python django无法从模板访问图像 url,python django
【发布时间】:2020-02-10 15:23:23
【问题描述】:

这是views.py中的代码

def store (request):

    products = {
       'products':product.objects.all()
    }

    return render (request, 'neizer/products.html', context = products)

这是模板

{% block content %}

<div class="products-parent">
  {%for product in products%}
  <div class="product-child">
    <img src={{product.image.url}} alt="no image available" />
    <h2>{{product.name}}</h2>
    <button id="learn-more-btn">learn more</button>
    <p>${{product.price}} <i class="fas fa-cart-plus"></i></p>
  </div>

  {% endfor %}
</div>
{% endblock content %}

我使用 /admin 界面上传图像,当我在 django shell 中访问图像 url 时,我得到一个实际的 url(它在浏览器中打开到图像),但是当我尝试在模板中访问它时,我得到上述错误, 看起来问题出在product.image.url 上,不知何故,django 似乎没有正确地获取类实例。 这是回溯:

Traceback (most recent call last):
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 828, in _resolve_lookup
    current = current[bit]

During handling of the above exception ('ImageFieldFile' object is not subscriptable), another exception occurred:
  File "/mnt/s/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/mnt/s/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/mnt/s/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/mnt/s/webapp/main/views.py", line 20, in store
    return render (request, 'neizer/products.html', context = products)
  File "/mnt/s/env/lib/python3.6/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 171, in render
    return self._render(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 936, in render
    bit = node.render_annotated(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 903, in render_annotated
    return self.render(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 936, in render
    bit = node.render_annotated(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 903, in render_annotated
    return self.render(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 936, in render
    bit = node.render_annotated(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 903, in render_annotated
    return self.render(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/defaulttags.py", line 209, in render
    nodelist.append(node.render_annotated(context))
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 903, in render_annotated
    return self.render(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 986, in render
    output = self.filter_expression.resolve(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 670, in resolve
    obj = self.var.resolve(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 795, in resolve
    value = self._resolve_lookup(context)
  File "/mnt/s/env/lib/python3.6/site-packages/django/template/base.py", line 836, in _resolve_lookup
    current = getattr(current, bit)
  File "/mnt/s/env/lib/python3.6/site-packages/django/db/models/fields/files.py", line 61, in url
    self._require_file()
  File "/mnt/s/env/lib/python3.6/site-packages/django/db/models/fields/files.py", line 38, in _require_file
    raise ValueError("The '%s' attribute has no file associated with it." % self.field.name)

Exception Type: ValueError at /store
Exception Value: The 'image' attribute has no file associated with it.

【问题讨论】:

  • 您实际上遇到了什么错误?
  • 值错误,“图像”属性没有与之关联的文件。
  • 你在哪里看到这个错误?你能粘贴整个错误跟踪吗?
  • 请提供整个错误跟踪。将其粘贴到问题中。

标签: python django django-models django-orm html-templates


【解决方案1】:

发生错误是因为并非所有记录都关联了图像文件。 此错误最简单的解决方案是检查是否存在关联图像:

{% if person.image %}
    <img src={{product.image.url}} />
{% else %}
    <img src="#" alt="no image available" />
{% endif %}

另一种方法是实际为图像字段(默认图像)设置一个默认值:

image = models.ImageField(upload_to='whatever', default='your_default_image.jpg')

或者至少在模板中放一张默认图片:

...
{% else %}
    <img src="{% static 'your_default_img_path' %}" >
...

还有一种方法是模型的用户属性:

@property
def get_image_url(self):
    if self.image and hasattr(self.image, 'url'):
        return self.image.url
    else:
        return "/static/images/your_default_image.jpg"

【讨论】:

  • 现在应该修复错误,但我不能使用默认图像,它应该是产品图片
  • 当我尝试在 django shell 中访问它时,我得到了一个关联的图像 url,所以显然有一个与产品实例关联的图像
  • product.objects.all() 表示您正在尝试显示所有现有记录 - 您确定所有记录都设置了图像吗?
  • 但是即使没有图片也不会报错,模板只会渲染一个空字符串。
  • 让我们尝试一些非常简单的东西 - Product.objects.filter(image__exact='').count() 你能检查它是否返回大于零的值吗?
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2013-04-16
  • 2014-07-21
  • 1970-01-01
相关资源
最近更新 更多