首页 > 解决方案 > 如何在 Django 中更新 ImageField?

问题描述

我是 Django 的新手。我在更新 ImageField 时遇到问题。我有以下代码

在模型.py

 class ImageModel(models.Model):
      image_name = models.CharField(max_length=50)
      image_color = models.CharField(max_length=50)
      image_document = models.ImageField(upload_to='product/')

-这是我的forms.py

 class ImageForm(forms.ModelForm):
    class Meta:
        model = ImageModel
        fields = ['image_name', 'image_color' , 'image_document']

在 Html 文件中 (editproduct.html)

<form method="POST" action="/myapp/updateimage/{{ singleimagedata.id }}">
       {% csrf_token %}
        <input class="form-control" type="text" name="image_name" value="{{ singleimagedata.image_name}}">
        <input class="form-control" type="file" name="image_document">
        <button type="submit" class="btn btn-primary">UPDATE PRODUCT</button>
</form>

-myapp 是我的应用程序名称。{{singleimagedata}} 是一个包含所有获取数据的变量

-urls.py

urlpatterns = [
    path('productlist', views.productlist, name='productlist'),
    path('addproduct', views.addproduct, name='addproduct'),
    path('editimage/<int:id>', views.editimage, name='editimage'),
    path('updateimage/<int:id>', views.updateimage, name='updateimage'),
]

这是我的views.py

def productlist(request):
    if request.method == 'GET':
        imagedata = ImageModel.objects.all()
        return render(request,"product/productlist.html",{'imagedata':imagedata})

def addproduct(request):
    if request.method == 'POST':
        form = ImageForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            messages.add_message(request, messages.SUCCESS, 'Image Uploaded')
            return redirect('/myapp/productlist')
    else:
        imageform = ImageForm()
        return render(request, "product/addproduct.html", {'imageform': imageform})

def editimage(request, id):
    singleimagedata = ImageModel.objects.get(id=id)
    return render(request, 'product/editproduct.html', {'singleimagedata': singleimagedata})

def updateimage(request, id):  #this function is called when update data
    data = ImageModel.objects.get(id=id)
    form = ImageForm(request.POST,request.FILES,instance = data)
    if form.is_valid():
        form.save()
        return redirect("/myapp/productlist")
    else:
        return render(request, 'demo/editproduct.html', {'singleimagedata': data})

标签: pythondjangodjango-modelsdjango-formsdjango-views

解决方案


我想你错过了enctype="multipart/form-data",尝试改变:

<form method="POST" action="/myapp/updateimage/{{ singleimagedata.id }}">

进入;

<form method="POST" enctype="multipart/form-data" action="{% url 'updateimage' id=singleimagedata.id %}">

不要错过将image_color字段添加到您的html输入。
因为,在您的情况下,image_color字段模型被设计为required field

从目录中删除和更新旧图像文件;

import os
from django.conf import settings

# your imported module...


def updateimage(request, id):  #this function is called when update data
    old_image = ImageModel.objects.get(id=id)
    form = ImageForm(request.POST, request.FILES, instance=old_image)

    if form.is_valid():

        # deleting old uploaded image.
        image_path = old_image.image_document.path
        if os.path.exists(image_path):
            os.remove(image_path)

        # the `form.save` will also update your newest image & path.
        form.save()
        return redirect("/myapp/productlist")
    else:
        context = {'singleimagedata': old_image, 'form': form}
        return render(request, 'demo/editproduct.html', context)

推荐阅读