Django表单实例未显示上传的图像

时间:2020-04-11 15:03:48

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

我正在Django中建立CMS平台。我想创建EDIT Post方法,以便任何人都可以编辑其帖子。主要问题是ImageField。由于Django的Models.py中必须使用ImageField。因此,在为用户创建Edit Post方法ImageField时,在创建帖子时上传的图片为空。

该图像在Post模型(数据库)中可用,但未显示在EDIT Post Page上。除了图像外,其他所有字段都是可编辑且可见的。

enter image description here

这是“编辑帖子视图”

def updatePost(request,pk):
    getEditPost= get_object_or_404(Post,pk=pk)

    if request.method=="POST":
        form = CkEditorForm(request.POST,request.FILES,instance=getEditPost)
        try:
            if form.is_valid():
                form.save()
        except Exception as e:
            print(e)
    else:
        form = CkEditorForm(instance=getEditPost)

    context= {
        'myForm':form,
        'post':getEditPost,
    }

    return render(request,"post/editPost.html",context)

这是我的表格。py

class CkEditorForm(ModelForm):
    .....
    .....
    featuredImage = forms.ImageField(required=True)

我的模型。py

class Post(models.Model):
    .....
    .....
    featuredImage = models.ImageField(upload_to="featured_image/")

2 个答案:

答案 0 :(得分:0)

您是否已在settings.py文件中添加了MEDIA_URL和MEDIA_ROOT

答案 1 :(得分:0)

我不确定是否有任何方法可以从后端加载图像字段中的图像。但是您可以简单地在编辑页面上查看图像,以便用户了解之前上传的是哪个图像。 (在编辑页面将图像字段留空不会影响数据库中的图像字段。)

执行这些更改以在编辑页面上加载图像:

views.py

# Create your views here.
def updatePost(request,pk):
    getEditPost= get_object_or_404(Post,pk=pk)

    if request.method=="POST":
        form = CkEditorForm(request.POST,request.FILES,instance=getEditPost)
        try:
            if form.is_valid():
                form.save()
        except Exception as e:
            print(e)
    else:
        form = CkEditorForm(instance=getEditPost)

    context= {
        'myForm':form,
        'post':getEditPost,
        # add this line
        'feature_image': getEditPost.featuredImage,
    }
    return render(request,"post/editPost.html",context)

editPost.html

...
<!-- Before closing the blody tag -->

<script>
    let image_field = document.getElementById('id_featuredImage') // form > image field
    let load_image = document.createElement('img')
    // Add media root before image link, in this case I'm adding /media/
    load_image.setAttribute('src', "/media/{{feature_image}}")
    load_image.setAttribute('alt', "Feature image")
    image_field.parentNode.insertBefore(load_image, image_field.nextSibling)
 </script>