Heroku部署的Django应用提交Summernote表单报错:clean()意外参数styles
问题分析
提交表单时出现clean() got an unexpected keyword argument 'styles'错误,根源是当前环境的bleach版本(大概率是4.0+)已移除clean()方法的styles参数,但django-summernote的fields.py仍在使用旧API调用,导致参数不匹配。
解决方案
以下是三种可行的解决方式,按推荐优先级排序:
方案一:自定义Summernote字段(推荐,无版本依赖风险)
通过自定义字段类替代django-summernote原有的字段,适配新版bleach的API:
- 在你的项目任意app下创建
fields.py文件,写入适配代码:
from django.db import models from django.forms import fields import bleach from bleach.css_sanitizer import CSSSanitizer from django_summernote.settings import ALLOWED_TAGS, ATTRIBUTES, STYLES from django_summernote.widgets import SummernoteWidget class SummernoteTextFormField(fields.CharField): def __init__(self, *args, **kwargs): kwargs.update({'widget': SummernoteWidget()}) super().__init__(*args, **kwargs) def to_python(self, value): value = super().to_python(value) # 适配bleach 4.0+的CSS sanitizer API css_sanitizer = CSSSanitizer(allowed_css_properties=STYLES) return bleach.clean( value, tags=ALLOWED_TAGS, attributes=ATTRIBUTES, css_sanitizer=css_sanitizer ) class SummernoteTextField(models.TextField): def formfield(self, **kwargs): kwargs.update({'form_class': SummernoteTextFormField}) return super().formfield(**kwargs) def to_python(self, value): value = super().to_python(value) css_sanitizer = CSSSanitizer(allowed_css_properties=STYLES) return bleach.clean( value, tags=ALLOWED_TAGS, attributes=ATTRIBUTES, css_sanitizer=css_sanitizer )
- 修改
models.py,替换原字段导入:
# 注释掉原导入语句 # from django_summernote.fields import SummernoteTextFormField, SummernoteTextField # 导入自定义字段 from your_app.fields import SummernoteTextField class Job(models.Model): # ... 其他字段保持不变 ... description = SummernoteTextField() # ... 其他字段保持不变 ...
- 提交代码到Heroku重新部署,即可适配新版bleach的API逻辑。
方案二:锁定兼容的bleach版本
如果不想修改代码,可在requirements.txt中指定与当前django-summernote兼容的旧版bleach(<4.0):
bleach==3.3.1
提交修改后的requirements.txt到Heroku,重新部署后会安装兼容旧API的bleach版本,参数错误即可消失。
方案三:Monkey Patch(临时应急)
若需快速修复且不想修改模型/字段,可在settings.py末尾添加补丁代码,替换django-summernote原有的方法:
import bleach from bleach.css_sanitizer import CSSSanitizer from django_summernote import fields from django_summernote.settings import STYLES, ALLOWED_TAGS, ATTRIBUTES def patched_to_python(self, value): value = super(type(self), self).to_python(value) css_sanitizer = CSSSanitizer(allowed_css_properties=STYLES) return bleach.clean( value, tags=ALLOWED_TAGS, attributes=ATTRIBUTES, css_sanitizer=css_sanitizer ) # 替换原字段的to_python方法 fields.SummernoteTextFormField.to_python = patched_to_python fields.SummernoteTextField.to_python = patched_to_python
注:该方法依赖django-summernote的内部结构,后续版本更新可能失效,仅作临时应急使用。
验证
部署完成后,测试表单提交和后台管理编辑功能,确认错误消失即可。
内容的提问来源于stack exchange,提问作者Walsh259
相关产品推荐
相关产品推荐

