Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在验证和保存表单之前,如何从ImageField打开图像?_Python_Django_Django Forms_Django Views_Python Imaging Library - Fatal编程技术网

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,})