Django - ImageField 文件没有显示?
Posted
技术标签:
【中文标题】Django - ImageField 文件没有显示?【英文标题】:Django - ImageField files not showing up? 【发布时间】:2014-03-28 14:47:41 【问题描述】:这是我的models.py:
class UserImages(models.Model):
user = models.ForeignKey(User)
photo = models.ImageField(upload_to=get_file_path)
这是我上传图片的视图:
def uploadImageView(request):
if request.method == 'POST':
form = UploadImageForm(request.POST, request.FILES)
if form.is_valid():
instance = form.save(commit=False)
instance.user = request.user
instance.save()
return redirect('/')
else:
form = UploadImageForm()
return render(request, 'image.html', 'form': form)
这是显示用户图像的视图:
def displayImageView(request):
user = request.user
img = UserImages.objects.filter(Q(user__username=user))
return render(request, "displayImage.html", "img": img)
这是我的 displayImage.html 模板:
% load staticfiles %
% for image in img %
<img src="% static image.photo.url %" />
% endfor %
当我转到加载模板的 URL 时,它会显示四个图像。我记得在测试uploadImageView的时候,我上传了4张图片给查看器。 Django 保存图像的位置是
/home/images/static
然后我去了那个文件夹并删除了两张图片。然后我刷新了模板页面,它仍然显示 4 个图像而不是两个,所以我认为我必须从实际数据库而不是文件夹中删除它。然后我做了
python manage.py shell
>>> from app.models import UserImages
>>> from django.contrib.auth.models import User
>>> a = User.objects.get(username='testUser')
>>> b = UserImages(user=a)
>>> b
<UserImages: UserImages object>
>>> b.photo
<ImageFieldFile: None>
正如你所见,我上传了 4 张图片的用户只显示了一个 ImageFieldFile。我怎么只能看到一个?
编辑:
我的 UploadImageForm() 就是这样的:
class UploadImageForm(forms.ModelForm):
class Meta:
model = UserImages
fields = ['photo']
【问题讨论】:
【参考方案1】:你的问题在这里:
>>> b = UserImages(user=a)
>>> b
<UserImages: UserImages object>
>>> b.photo
<ImageFieldFile: None>
这段代码 sn-p 正在创建UserImages
的新实例,将user
属性设置为对象a
。它不是在搜索数据库。由于您没有将任何图像附加到这个新实例,b
是None
。
要搜索,您需要这样做:
>>> b = UserImages.objects.filter(user=a)
您也不应该将任何内容上传到STATICFILES_DIRS
指向的同一文件夹,因为该文件夹由 django 管理,您在此处的文件将被覆盖。我希望/home/images/static
没有在此处列出。
用户上传的内容保存在MEDIA_FILES
指向的子目录中,并使用MEDIA_URL
访问。
【讨论】:
嗯好的,所以有两个问题。 -1-如果我想删除,比如说b中的4张图片中的两张,那我该怎么做? -2- 我试过 b = UserImages.objects.get(user=a) 但它给出了一个错误,说“MultipleObjectsReturned:get() 返回了多个 UserImages - 它返回了 4!”为什么它给出了错误但 b=Userimage.objects.filter(user=a) 也返回了 4 但没有错误? 是的,因为您使用的是get
,如果返回多行会引发异常(您注意到我在回答中使用了filter
)。这就是get
的工作原理。
CSS 文件不同于图像。 STATICFILES_DIRS 用于作为应用程序的一部分提供的文件;使您的应用程序工作所需的(这包括 CSS 文件、图像、javascript 等)。您的用户上传的文件放在名为 MEDIA_FILES 的不同文件夹中,并使用 MEDIA_URL 访问。原因是 collectstatic
命令管理静态文件并将收集所有应用程序中的所有静态文件并将它们放在 STATIC_ROOT 中。
您可以在模板中使用 MEDIA_URL
标签,在开发代码时,您可以使用this snippet 来提供媒体文件。 Django 只提供静态文件的助手,媒体文件的处理由你自己决定:)
它确实做了一些事情。检查您的数据库。【参考方案2】:
当您将图像保存在数据库中时,它们将被保存在那里以及/static/
目录中的新位置等。通常 Django 会附加一个image_1.jpg
,例如,如果图像最初是image.jpg
.
您的图像与User
模型有many-to-many
关系吗?之前,您说有 4 张图像保存到 User
,然后您说 1。您的 UserImages
模型有一个字段,因此您可能没有在 terminal shell
中正确循环以检查所有图像.如果b = UserImages(user=a)
或类似程度,也许它需要b.photos.all()
?
【讨论】:
以上是关于Django - ImageField 文件没有显示?的主要内容,如果未能解决你的问题,请参考以下文章
python/django - “无法使用 ImageField,因为没有安装 Pillow”
将 ImageField 添加到模型会导致 django 中的异常
Django - 将静态图像上传为默认 ImageField 文件