django - 加载带有没有图像的对象的页面时出现 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 }}"><</a>
|
{% endif %}
Часть №{{ page.number }} из {{ page.paginator.num_pages }}
{% if page.has_next %}
|
<a href="?page={{ page.next_page_number }}">></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.
解决方案
错误是因为注释了一行代码:
{% 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> -->
我之前评论过它只是为了尝试其他一些显示图像的方式,并且决定不将它包含在这个问题中。
我感谢那些试图帮助我的人!
推荐阅读
- python - Python 将时间、纬度和经度分配给来自 netcdf 文件的 xarray.DataSet 的“维度”
- arrays - 使用下一个运算符后迭代数组不移动到下一个对象
- c++ - 使用 C++ 项目将数据保存在磁盘上
- python - 如何根据 Pandas 数据框的条件增加计数器?
- machine-learning - 机器学习非线性假设
- recursion - Prolog递归累加器
- json - Scala:使用 find() 或 filter() 根据多个键值读取地图的内部图
- jquery - 如何在vue中选中或未选中复选框时添加和删除css的类?
- sql - SQL 层次结构字符串列到 XML
- python - 将 python 循环转换为 Theano