首页 > 解决方案 > 加载带有没有图像的对象的页面时出现 ValueError

问题描述

创建没有图像的 Bb 对象后,我收到此错误:“'image' 属性没有与之关联的文件。” 当我重新启动调试服务器时,我得到了同样的错误,直到我使用 django 管理面板为 Bb 对象提供了一个图像。

我想出的可能解决方案:添加默认静态图像:image = models.ImageField(verbose_name='Image', null=True, blank=True, default="default.jpg") 但我想知道为什么即使在models.py中传递null=True和时也会出现错误blank=True

模型.py:

class Bb(models.Model):

    title = models.CharField(max_length=50,
     verbose_name='Product', error_messages={'blank' : 'Wrong product name'})
    content = models.TextField(null=True, blank=True,
     verbose_name='Description')
    price = models.FloatField(null=True, blank=True,
     verbose_name='Current price')
    published = models.DateTimeField(auto_now_add=True, db_index=True,
     verbose_name='Published in')
    # Image
    image = models.ImageField(verbose_name='Image', null=True, blank=True)

视图.py:

from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.template import loader
from django.urls import reverse_lazy, reverse
from django.template.response import TemplateResponse
from django.core.paginator import Paginator

from .forms import BbForm, ImgForm, ImgNonМodelForm
from .models import Bb, Rubric, Img

def index(request):
    bbs = Bb.objects.all()

    # Paginator
    paginator = Paginator(bbs, 4)
    if 'page' in request.GET:
        page_num = request.GET['page']
    else:
        page_num = 1
    page = paginator.get_page(page_num)

    context = {'bbs' : page.object_list, 'page' : page}
    return TemplateResponse(request, 'bboard/index.html', context=context)


def create_bb(request):
    if request.method == 'POST':

        form_bb = BbForm(request.POST, request.FILES)
        form_images = ImgNonМodelForm(request.POST, request.FILES)
    
        if all([form_bb.is_valid(), form_images.is_valid()]):
            new_bb = form_bb.save()
            # Here I'm saving images from ImgNonModelForm
            for file in request.FILES.getlist('img'):
                img = Img()
                img.desc = form_images.cleaned_data['desc']
                img.img = file
                img.bb = new_bb
                img.save()

            return redirect('/bboard/')
    else:
        form_bb = BbForm()
        form_images = ImgNonМodelForm()

    context = {'form_bb' : form_bb, 'form_images' : form_images}
    return render(request, 'bboard/create_with_images.html', context) 


表格.py

from django import forms
from django.core import validators

from .models import Bb


class BbForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(BbForm, self).__init__(*args, **kwargs)
        self.fields['image'].required = False

    class Meta:
        model = Bb
        fields = ('title', 'content', 'price', 'image')

索引.html:

{% extends "layout/basic.html" %}
{% load thumbnail %}

{% block content %}
{% for bb in bbs %}
<div class="b">
    <h2><a href="{% url 'detail' pk=bb.pk %}">{{ bb.title }}</a></h2>
    <h2>{{ bb.title_with_price }}</h2>
    <p>{{ bb.content }}</p>
    <div>
        {% if bb.image %}
            <div><img src="{{ bb.image|thumbnail_url:'default' }}" alt="Missing image"></div>
        {% else %}
            <p>No image</p>
        {% endif %}
    </div>
    <p>{{ bb.published|date:"d.m.Y H:i:s" }}</p>
    <h3><a href="{% url 'edit' pk=bb.pk %}">Edit</a>
        <a href="{% url 'delete' pk=bb.pk %}">Delete</a></h3>
</div>
{% endfor %}
<div>
{% if page.has_previous %}
<a href="?page={{ page.previous_page_number }}">&lt;</a>
&nbsp;&nbsp;|&nbsp;&nbsp;
{% endif %}
Часть №{{ page.number }} из {{ page.paginator.num_pages }}
{% if page.has_next %}
&nbsp;&nbsp;|&nbsp;&nbsp;
<a href="?page={{ page.next_page_number }}">&gt;</a>
{% endif %}
</div>
{% endblock %}

这是追溯

Traceback (most recent call last):
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 829, in _resolve_lookup
    current = current[bit]

During handling of the above exception ('ImageFieldFile' object is not subscriptable), another exception occurred:
  File "D:\Python\Python 3.9.2\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\core\handlers\base.py", line 204, in _get_response
    response = response.render()
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\response.py", line 105, in render
    self.content = self.rendered_content
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\response.py", line 83, in rendered_content
    return template.render(context, self._request)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 170, in render
    return self._render(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 988, in render
    output = self.filter_expression.resolve(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 671, in resolve
    obj = self.var.resolve(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 796, in resolve
    value = self._resolve_lookup(context)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\template\base.py", line 837, in _resolve_lookup
    current = getattr(current, bit)
  File "D:\Python\Python 3.9.2\lib\site-packages\django\db\models\fields\files.py", line 62, in url
    self._require_file()
  File "D:\Python\Python 3.9.2\lib\site-packages\django\db\models\fields\files.py", line 39, in _require_file
    raise ValueError("The '%s' attribute has no file associated with it." % self.field.name)

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

标签: djangodjango-models

解决方案


错误是因为注释了一行代码:

{% extends "layout/basic.html" %}
{% load thumbnail %}

{% block content %}
{% for bb in bbs %}
<div class="b">
    <h2><a href="{% url 'detail' pk=bb.pk %}">{{ bb.title }}</a></h2>
    <h2>{{ bb.title_with_price }}</h2>
    <p>{{ bb.content }}</p>
    <div>
        

        <!-- The line was here! -->
        <!-- <div><img src="{{ MEDIA_URL }}{{ bb.image.url }}" alt="Missing image" 
        style="max-height:50px"></div> -->


        {% if bb.image %}
            <div><img src="{{ bb.image|thumbnail_url:'default' }}" alt="Missing image"></div>
        {% else %}
            <p>No image</p>
        {% endif %}
    </div>
    <p>{{ bb.published|date:"d.m.Y H:i:s" }}</p>
    <h3><a href="{% url 'edit' pk=bb.pk %}">Edit</a>
        <a href="{% url 'delete' pk=bb.pk %}">Delete</a></h3>
</div>
{% endfor %}
{% endblock %}

<!-- <div><img src="{{ MEDIA_URL }}{{ bb.image.url }}" alt="Missing image" style="max-height:50px"></div> -->

我之前评论过它只是为了尝试其他一些显示图像的方式,并且决定不将它包含在这个问题中。

我感谢那些试图帮助我的人!


推荐阅读