Django - ImageField文件没有显示?

时间:2014-02-26 01:52:27

标签: django django-models django-templates django-views django-queryset

这是我的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']

2 个答案:

答案 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。它不是在搜索数据库。由于您尚未将任何图片附加到此新实例,因此bNone

要进行搜索,您需要改为:

>>> b = UserImages.objects.filter(user=a)

您也不应该将任何内容上传到STATICFILES_DIRS指向的同一文件夹,因为此文件夹由django管理,此处的文件将被覆盖。我希望此处未列出/home/images/static

用户上传保存在MEDIA_FILES指向的子目录中,并使用MEDIA_URL进行访问。