Django - ImageField 文件未显示



这是我 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)还是那种程度

最新更新