加载包含没有图像的对象的页面时出现ValueError



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

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

models.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)

views.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) 

forms.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')

index.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:PythonPython 3.9.2libsite-packagesdjangotemplatebase.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:PythonPython 3.9.2libsite-packagesdjangocorehandlersexception.py", line 47, in inner
response = get_response(request)
File "D:PythonPython 3.9.2libsite-packagesdjangocorehandlersbase.py", line 204, in _get_response
response = response.render()
File "D:PythonPython 3.9.2libsite-packagesdjangotemplateresponse.py", line 105, in render
self.content = self.rendered_content
File "D:PythonPython 3.9.2libsite-packagesdjangotemplateresponse.py", line 83, in rendered_content
return template.render(context, self._request)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebackendsdjango.py", line 61, in render
return self.template.render(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 170, in render
return self._render(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 162, in _render
return self.nodelist.render(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplateloader_tags.py", line 150, in render
return compiled_parent._render(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 162, in _render
return self.nodelist.render(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplateloader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatedefaulttags.py", line 211, in render
nodelist.append(node.render_annotated(context))
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 988, in render
output = self.filter_expression.resolve(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 671, in resolve
obj = self.var.resolve(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 796, in resolve
value = self._resolve_lookup(context)
File "D:PythonPython 3.9.2libsite-packagesdjangotemplatebase.py", line 837, in _resolve_lookup
current = getattr(current, bit)
File "D:PythonPython 3.9.2libsite-packagesdjangodbmodelsfieldsfiles.py", line 62, in url
self._require_file()
File "D:PythonPython 3.9.2libsite-packagesdjangodbmodelsfieldsfiles.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.

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

{% 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> -->

我之前评论过它,只是想尝试一些其他显示图像的方式,也决定不将其包含在本期中。

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

相关内容

最新更新