这是我 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})
这是我的显示图像.html模板:
{% load staticfiles %}
{% for image in img %}
<img src="{% static image.photo.url %}" alt="" />
{% endfor %}
当我转到加载模板的 URL 时,它会显示四个图像。我记得在测试上传图像视图时,我为查看器上传了 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>
amd 如您所见,我为其上传 4 张图像的用户只显示了一个 ImageFieldFile。为什么我只能看到一个?
编辑:
我的上传图像表单()就是这样:
class UploadImageForm(forms.ModelForm):
class Meta:
model = UserImages
fields = ['photo']
你的问题在这里:
>>> b = UserImages(user=a)
>>> b
<UserImages: UserImages object>
>>> b.photo
<ImageFieldFile: None>
此代码片段正在创建 UserImages
的新实例,将 user
属性设置为对象a
。它不搜索数据库。由于您尚未将任何图像附加到此新实例,因此b
None
。
要进行搜索,您需要改为执行以下操作:
>>> b = UserImages.objects.filter(user=a)
你也不应该上传任何东西到STATICFILES_DIRS
指向的同一个文件夹,因为这个文件夹是由django管理的,你这里的文件将被覆盖。我希望/home/images/static
不在这里列出。
用户上传保存在 MEDIA_FILES
指向的子目录中,并使用 MEDIA_URL
进行访问。
当您将图像保存在数据库中时,它们将保存在数据库中以及/static/
目录中的新位置等。 通常 Django 会附加一个image_1.jpg
例如,如果图像最初是image.jpg
的。
您的图像是否与User
模型有many-to-many
关系?之前,您说有4张图像保存到User
,然后您说1张。 您的UserImages
模型有一个字段,因此您可能没有在terminal shell
中正确循环以检查所有图像。 也许需要b.photos.all()
是b = UserImages(user=a)
还是那种程度