Django - 使用 Cloudinary 清除上传的图像时'TypeError: expected string or bytes-like object'



我在我的 Django 应用程序中使用 Cloudinary 来存储和提供用户上传到我网站的一个视图中的图像。图像正在上传并正确显示;但是,在我的 UpdateView 中,当用户选中"清除"以删除以前的图像,然后提交表单时,会显示此错误:

类型错误:预期的字符串或类似字节的对象

浏览器中的错误页面还显示以下突出显示的消息:

...\lib\site-packages\cloudinary\models.py in to_python 返回self.parse_cloudinary_resource(值) ...

...\lib\site-packages\cloudinary\models.py in parse_cloudinary_resource m = re.match(CLOUDINARY_FIELD_DB_RE, value) ...

...\AppData\Local\Programs\Python\Python36-32\lib\re.py in match 返回_compile(模式,标志).匹配(字符串)

这些是我的模型、视图和表单的样子:

models.py:

class Item(models.Model):
name = models.CharField(max_length=255)
image1 = CloudinaryField('image', blank=True, null=True)

views.py

class ItemUpdateView(LoginRequiredMixin, UpdateView):
model = models.Item
form_class = forms.ItemForm

forms.py

class ItemForm(forms.ModelForm):
image1 = CloudinaryFileField(
required=False,
options = {'crop': 'limit', 'width': 546, 'height': 1000,})
class Meta:
model = models.Item
fields = ("image1", "name")

我认为当字段的值为空时,Cloudinary 仍然期待一些东西。我查看了文档并搜索了网络,但我只是不知道如何解决这个问题。

编辑:我检查了我的管理员并尝试从那里编辑一个项目,当我选中"清除"复选框并点击保存时,遇到了同样的错误。因此,问题似乎出在我如何在模型上创建 image1 字段,因为管理视图仅依赖于该字段。但我仍然不知道如何解决它。

编辑2:当我在图像字段上选中"清除"并单击保存时的完整回溯,来自管理员:

环境:

请求方法: 开机自检 请求网址: http://127.0.0.1:8000/admin/items/item/4/change/

Django 版本: 1.11.1 Python 版本: 3.6.1 已安装的应用程序: ['django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.humanize',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'django.contrib.sites',

"云",

"阿劳斯",

'Allauth.account',

'allauth.socialaccount',

'allauth.socialaccount.providers.google',

'allauth.socialaccount.providers.twitter',

"干草堆",

"项目"]

已安装的中间件: ['django.middleware.security.SecurityMiddleware',

'django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware',




'django.middleware.clickjacking.XFrameOptionsMiddleware']

追踪:

文件 "D:\projects\django\gia\lib\site-packages\django\core\handlers\exception.py" 在内部 41. 响应 = get_response(请求)

文件 "D:\projects\django\gia\lib\site-packages\django\core\handlers\base.py" 在_get_response 187. 响应 = self.process_exception_by_middleware(e,请求)

文件 "D:\projects\django\gia\lib\site-packages\django\core\handlers\base.py" 在_get_response 185. 响应 = wrapped_callback(请求、*callback_args、**callback_kwargs)

文件 "D:\projects\django\gia\lib\site-packages\django\contrib\admin\options.py" 在包装器中 551. 返回 self.admin_site.admin_view(view)(*args, **kwargs)

文件 "D:\projects\django\gia\lib\site-packages\django\utils\decorators.py" 在_wrapped_view 149. 响应 = view_func(请求, *参数, **夸格)

文件 "D:\projects\django\gia\lib\site-packages\django\views\decorators\cache.py" 在_wrapped_view_func 57. 响应 = view_func(请求, *参数, **夸格)

文件 "D:\projects\django\gia\lib\site-packages\django\contrib\admin\sites.py" 在内部 224. 返回视图(请求,*参数,**夸格)

文件 "D:\projects\django\gia\lib\site-packages\django\contrib\admin\options.py" 在change_view 1511.退货self.changeform_view(请求、object_id、form_url、extra_context)

文件 "D:\projects\django\gia\lib\site-packages\django\utils\decorators.py" 在_wrapper 67.返回bound_func(*参数,**夸格)

文件 "D:\projects\django\gia\lib\site-packages\django\utils\decorators.py" 在_wrapped_view 149. 响应 = view_func(请求, *参数, **夸格)

文件 "D:\projects\django\gia\lib\site-packages\django\utils\decorators.py" 在bound_func 63. 返回功能。get(self, type(self))(*args2, **kwargs2)

文件 "D:\projects\django\gia\lib\site-packages\django\contrib\admin\options.py" 在changeform_view1408.退货self._changeform_view(请求、object_id、form_url、extra_context)

文件 "D:\projects\django\gia\lib\site-packages\django\contrib\admin\options.py" 在_changeform_view 1440. 如果form.is_valid():

文件 "D:\projects\django\gia\lib\site-packages\django\forms\forms.py" 在is_valid 183.返回self.is_bound而不是自我错误

文件 "D:\projects\django\gia\lib\site-packages\django\forms\forms.py" 在错误中 175. self.full_clean()

文件 "D:\projects\django\gia\lib\site-packages\django\forms\forms.py" 在full_clean 386. self._post_clean()

文件 "D:\projects\django\gia\lib\site-packages\django\forms\models.py" 在_post_clean 396. self.instance.full_clean(排除=排除,validate_unique=假)

文件 "D:\projects\django\gia\lib\site-packages\django\db\models\base.py" in full_clean 1226. self.clean_fields(排除=排除)

文件 "D:\projects\django\gia\lib\site-packages\django\db\models\base.py" in clean_fields 1268. 塞塔特(自我, f.attname, f.clean(raw_value, 自我))

文件 "D:\projects\django\gia\lib\site-packages\django\db\models\fields__init__.py" 在清洁 601. 值 = self.to_python(值)

文件 "D:\projects\django\gia\lib\site-packages\cloudinary\models.py" 在to_python 74. 返回self.parse_cloudinary_resource(值)

文件 "D:\projects\django\gia\lib\site-packages\cloudinary\models.py" 在parse_cloudinary_resource 50. m = re.match(CLOUDINARY_FIELD_DB_RE, 值)

文件 "C:\Users\samee\AppData\Local\Programs\Python\Python36-32\lib\re.py" 匹配中 172. 返回_compile(模式,标志).匹配(字符串)

异常类型:/admin/items/item/4/change/异常处的类型错误 值:预期的字符串或类似字节的对象

也许这里有点晚了,但我遇到了同样的问题,在寻找解决方案的过程中,我偶然发现了这个。

我发现验证方法仍在寻找不再存在的对象。通过单击清除按钮,您可以有效地将其从回发中删除。默认情况下,验证设置为标记它,因为它正在尝试 clea(验证)现在不再存在的东西。

你很容易绕过它。只需创建 is_valid 方法调用的 clean 方法。图片将不再存在,因此只需返回 None。下面是一个代码示例:

从我的is_valid():

if request.method == 'POST':
if picture_form_set.is_valid():

这反过来调用了 clean 方法,因此为 Cloudaniry 字段创建一个:

def clean_picture(self):
return self.cleaned_data['picture'] or None

希望有帮助

问题在于CloudinaryField中的to_python方法,它期望图像的值为 none,但得到一个 False。 解决方案创建一个继承自父级的新字段,CloudinaryField应用修复并将其用作模型字段。

Marco Silva关于这个github问题的解决方案,https://github.com/cloudinary/pycloudinary/issues/98。

class CloudinaryFieldFix(CloudinaryField):
def to_python(self, value):
if value is False:
return value
else:
return super(FixCloudinaryField, self).to_python(value)

相关内容

最新更新