这是我的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 %}" alt="" />
{% 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>
你可以看到,只有一个ImageFieldFile显示给我上传了4张图片的用户。为什么我只能看到一个?
编辑:
我的UploadImageForm()就是这样:
class UploadImageForm(forms.ModelForm):
class Meta:
model = UserImages
fields = ['photo']
答案 0 :(得分:1)
当您在数据库中保存图像时,它们将保存在/static/
目录中的新位置等。通常Django会附加image_1.jpg
,例如图像是最初image.jpg
。
您的图片与many-to-many
模型有User
的关系吗?之前,你说过User
保存了4张图片,然后你说1.你的UserImages
模型有一个字段,所以你可能没有在terminal shell
中正确地循环它为了检查所有图像。如果b.photos.all()
或某种程度的东西,它可能需要b = UserImages(user=a)
吗?
答案 1 :(得分:1)
你的问题在这里:
>>> 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
进行访问。