python - 如何在 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})
- 我的图片上传工作正常。我无法在更新数据时更新图片。其余数据已更新。我不知道如何更新图片以及如何删除旧图片并将新图片放入目录。
解决方案
我想你错过了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)
推荐阅读
- css - Material-ui Accordion 填充容器
- c# - 使用 --userdata dir 参数和隐身模式在 c# 中打开 chrome
- javascript - Javascript 需要防止输入空格
- appium - Appium Android mjpegScreenshotUrl 远程 URL 和端口号不起作用
- c - 应该在代码中添加什么以免出现“注意:在此处声明 WINBASEAPI BOOL WINAPI CreateProcessA”之类的错误
- c - C中字母链表中的分段错误
- python - 我的方法有问题还是我有问题?
- installation - ln:创建符号链接“libz.so”失败:不允许操作
- javascript - 基于复选框选择触发不同活动的算法
- python - Python 立体投影