You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 在你的项目任意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
        )
  1. 修改models.py,替换原字段导入:
# 注释掉原导入语句
# from django_summernote.fields import SummernoteTextFormField, SummernoteTextField
# 导入自定义字段
from your_app.fields import SummernoteTextField

class Job(models.Model):
    # ... 其他字段保持不变 ...
    description = SummernoteTextField()
    # ... 其他字段保持不变 ...
  1. 提交代码到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:15:48