我在我的Django应用程序中使用Cloudinary来存储和提供用户在我站点的一个视图中上传的图像 . 图像正在上传并正确显示;但是,在我的UpdateView中,当用户选中“清除”以删除上一个图像然后提交表单时,会显示以下错误:
TypeError:期望的字符串或类似字节的对象
浏览器中的错误页面还会显示以下突出显示的消息:
... \ lib \ site-packages \ cloudinary \ models.py在to_python中返回self.parse_cloudinary_resource(value)... ... \ 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 return _compile(pattern,flags).match(string)
这些是我的模型,视图和表单的样子:
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仍然期待某些东西 . 我查看了文档并搜索了网页,我无法弄清楚如何解决这个问题 .
Edit: 我检查了我的管理员,并尝试从那里编辑项目,当我选中'clear'复选框并点击保存时出现同样的错误 . 所以似乎问题在于我如何知道如何修复它 .
Edit2: 完全回溯当我在图像字段上检查'clear'并从管理员单击保存时:
环境:请求方法:POST请求URL:http://127.0.0.1:8000 / admin / item / itm / 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','cloudinary','allauth','allauth.account','allauth.socialaccount','allauth.socialaccount.providers.google','allauth.socialaccount.providers.twitter', 'haystack','items']已安装的中间件:['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'] Traceback:File“D:\ projects \ django \ gia \ LIB \站点包age \ django \ core \ handlers \ exception.py“在内部41. response = get_response(request)文件”D:\ projects \ django \ gia \ lib \ site-packages \ django \ core \ handlers \ base.py“in _get_response 187. response = self.process_exception_by_middleware(e,request)_get_response 185中的文件“D:\ projects \ django \ gia \ lib \ site-packages \ django \ core \ handlers \ base.py”.response = wrapped_callback(request, * 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)wrapped_view中的文件“D:\ projects \ django \ gia \ lib \ site-packages \ django \ utils \ decorators.py”149. response = view_func(request,* args,** kwargs)File“D : projects \ django \ gia \ lib \ site-packages \ django \ views \ decorators \ cache.py“in _wrapped_view_func 57. response = view_func(request,* args,** kwargs)File”D:\ projects \ django \内部224中的gia \ lib \ site-packages \ django \ contrib \ admin \ sites.py“返回视图(请求,* args,** kwargs)Fil在change_view 1511中的“D:\ projects \ django \ gia \ lib \ site-packages \ django \ contrib \ admin \ options.py” . return self.changeform_view(request,object_id,form_url,extra_context)文件“D:\ projects在_wrapper 67中的\ django \ gia \ lib \ site-packages \ django \ utils \ decorators.py“ . 返回bound_func(* args,** kwargs)文件”D:\ projects \ django \ gia \ lib \ site-packages \ django \ utils \ decorators.py“in _wrapped_view 149. response = view_func(request,* args,** kwargs)File”D:\ projects \ django \ gia \ lib \ site-packages \ django \ utils \ decorators.py“在bound_func 63. return func.get(self,type(self))(* args2,** kwargs2)File“D:\ projects \ django \ gia \ lib \ site-packages \ django \ contrib \ admin \ options.py “在changeform_view 1408.返回self._changeform_view(request,object_id,form_url,extra_context)_changeform_view 1440中的文件”D:\ projects \ django \ gia \ lib \ site-packages \ django \ contrib \ admin \ options.py“ . form.is_valid():文件“D:\ projects \ django \ gia \ lib \ site-packages \ django \ forms \ forms.py”in is_valid 183. return self.is_bound而不是self.errors文件“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“in full_clean 386. self._post_clean()文件”D:\ projects \ django \ gia \ lib \ site-packages \ django \ forms \ models.py“in _post_clean 396. self_instance.full_clean(exclude = exclude,validate_unique = False)文件“D:\ projects \ django \ gia \ lib \ site-packages \ django \ db \ models \ base.py”在full_clean 1226中.self.clean_fields (exclude = exclude)文件“d:\项目\ Django的\ GIA \ LIB \站点包\ Django的\ DB \型号\ base.py” 在clean_fields 1268 SETATTR(个体经营,f.attname,f.clean(RAW_VALUE,个体经营))文件“d :\项目\ Django的\ GIA \ LIB \站点包\ Django的\ DB \型号\ fields__init __ PY “清洁601值= self.to_python(值)文件” d:\项目\ Django的\ GIA \ LIB \网站-packages \ cloudinary \ models.py”在to_python 74返回self.parse_cloudinary_resource(值)文件 “d:\项目\ Django的\ GIA \ LIB \站点包\ cloudinary \ models.py” 在parse_cloudinary_resource 50. M =重.match(CLOUDINARY_FIELD_DB_RE,值)文件 “C:\用户\ samee \应用程序数据\本地\程序\ Python的\ Python36-32 \ LIB \ re.py” 比赛中回172 _compile(图案,标志).match(串)异常类型:TypeError在/ admin / items / item / 4 / change / Exception值:预期的字符串或类似字节的对象
2 回答
也许有点晚了,但我有同样的问题,在我寻找解决方案时,我偶然发现了这个问题 .
我得出的结论是验证方法仍在寻找不再存在的对象 . 通过单击清除按钮,您可以有效地将其从帖子后面移除 . 验证默认设置为标记它,因为它试图清除(验证)现在不再存在的东西 .
你很容易解决它 . 只需创建is_valid方法调用的clean方法即可 . 图片不再存在所以只返回无 . 这是一个代码示例:
来自我的is_valid():
然后调用clean方法,因此为Cloudaniry字段创建一个:
希望有所帮助
问题在于
CloudinaryField
中的to_python
方法,它期望image的值为none,而是获得False . 解决方案创建一个从父级继承的新字段CloudinaryField
应用修复并将其用作模型字段 .Marco Silva在这个github问题上的解决方案,https://github.com/cloudinary/pycloudinary/issues/98 .