Python 在验证和保存表单之前,如何从ImageField打开图像?
我想根据Python 在验证和保存表单之前,如何从ImageField打开图像?,python,django,django-forms,django-views,python-imaging-library,Python,Django,Django Forms,Django Views,Python Imaging Library,我想根据ImageField的值获取CharField的值。我的表单和视图定义为: #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 =
ImageField
的值获取CharField
的值。我的表单和视图定义为:
#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\U数据
已更新,但是,一旦我使用Image.open()
,我就会收到以下错误消息:
上传一个有效的图像。您上载的文件不是图像或图像已损坏
如果我对有关I
的行进行注释,并将gps\u数据
修改为任何内容,则表单(带图像)将保存,不会出现任何错误
# 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" ... >
然后,您可以从磁盘打开它:
image = Image.open(random_file_name)
if image.mode != "RGB":
image = image.convert("RGB")
...
此URL可能会帮助您:
我终于找到了一种更干净的解决方案: 我从模型中删除了“required=True”,并定义了一个clean()方法,该方法在我的表单模型中执行此任务:
#Form
class GpsImForm(forms.Form):
image = forms.ImageField(required=True)
gps_data = forms.CharField()
def clean(self):
super(forms.Form, self)).clean()
if not self.cleaned_data['gps_data']: # the user can provide the gps_data manually
if self.cleaned_data['image']: # if he provided no gps_data but an image
i = Image.open(self.cleaned_data['image'])
... # functions to extract exif data from i
else:
msg = _("You have to provide an image or a gps_data.")
self._errors['gps_data'] = self.error_class([msg])
return self.cleaned_data
#View
def gpsim_gen_view(request):
if request.method == 'POST':
form = GpsImForm(request.POST, request.FILES)
if form.is_valid():
obj = form.save()
return ... #returns the gpsim
else:
form = GpsImForm()
return direct_to_template(request, 'gpsim_generate.html', {'form': form,})
您尝试过什么类型的图像?在没有jpeg支持的情况下安装PIL是一个常见的问题,在这种情况下,您需要卸载PIL,安装libjpeg,然后重新安装PIL。实际上,问题不在于libjpeg。正如在问题的最后所说,当我不使用Image.open()时,表单(带有图像)将被保存,不会出现任何错误。无论如何,谢谢:-)您的问题听起来与此类似,因此我正在检查您是否尝试过其他文件类型:是的,我有enctype标记。您的解决方案很可能会工作,但必须完成所有这些工作是很无聊的:(.我提供的解决方案可能是一种更干净的方式来实现我想要的功能。谢谢!
#Form
class GpsImForm(forms.Form):
image = forms.ImageField(required=True)
gps_data = forms.CharField()
def clean(self):
super(forms.Form, self)).clean()
if not self.cleaned_data['gps_data']: # the user can provide the gps_data manually
if self.cleaned_data['image']: # if he provided no gps_data but an image
i = Image.open(self.cleaned_data['image'])
... # functions to extract exif data from i
else:
msg = _("You have to provide an image or a gps_data.")
self._errors['gps_data'] = self.error_class([msg])
return self.cleaned_data
#View
def gpsim_gen_view(request):
if request.method == 'POST':
form = GpsImForm(request.POST, request.FILES)
if form.is_valid():
obj = form.save()
return ... #returns the gpsim
else:
form = GpsImForm()
return direct_to_template(request, 'gpsim_generate.html', {'form': form,})