我想根据 ImageField
的值获取 CharField
的值。我的表单和 View 定义为:
#Form
class GpsImForm(forms.Form):
image = forms.ImageField(required=True)
gps_data = forms.CharField(required=True)
#View
def gpsim_gen_view(request):
if request.method == 'POST':
form = GpsImForm(request.POST, request.FILES)
if 'image' in request.FILES:
im = request.FILES['image']
i = Image.open(im)
... # functions to extract exif data from i
request.POST.update({ 'gps_data': ...}) # set gps_data based on exif data from i
if form.is_valid():
obj = form.save()
return ... #returns the gpsim
else:
form = GpsImForm()
return direct_to_template(request, 'gpsim_generate.html', {'form': form,})
gps_data
已更新,但是,一旦我使用 Image.open()
,我就会收到以下错误消息:
Upload a valid image. The file you uploaded was either not an image or a corrupted image.
如果我注释有关i
的行并将gps_data
修改为任何内容,则表单(带有图像)将被保存而不会出现任何错误...
# i = Image.open(im)
# ...
# functions to extract exif data from i
request.POST.update({ 'gps_data': 'some text'}) # set gps_data to 'test'
最佳答案
首先,确保您的表单具有 enctype 标记
<form enctype="multipart/form-data" ... >
尝试将img(所有 block )写入磁盘:
import Image
from random import choice
from django.conf import settings
random_file_name = getattr(settings, 'FILE_UPLOAD_TEMP_DIR', '/tmp')
random_file_name += '/' + ''.join([choice('abcdefg') for i in range(12)]) + '.jpg'
destination = open(random_file_name, 'wb+')
for chunk in request.FILES['image'].chunks():
destination.write(chunk)
destination.close()
然后,您可以从磁盘打开它:
image = Image.open(random_file_name)
if image.mode != "RGB":
image = image.convert("RGB")
...
此网址可能对您有帮助:
https://docs.djangoproject.com/en/dev/topics/http/file-uploads/
关于python - 在验证和保存表单之前,如何从 ImageField 打开图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12515060/