Django中CKEditor表单提交后保存为textarea而非编辑内容的问题
问题解决步骤
核心问题分析
- 表单类定义错误:使用
forms.Form却添加Meta关联模型,不符合Django表单规范,应改用ModelForm来匹配模型字段。 - 视图数据处理错误:创建
Document对象时直接将整个表单对象赋值给body字段,导致保存的是表单对象的字符串表示(含textarea标签),而非CKEditor编辑内容。 - 表单实例化错误:GET请求页面时传递的是表单类而非实例,虽能渲染但不符合规范,存在潜在问题。
1. 修改forms.py
将forms.Form改为ModelForm,并纳入header字段(避免手动从request.POST取值,提升安全性):
from django import forms from .models import Document from ckeditor.widgets import CKEditorWidget class PostForm(forms.ModelForm): body = forms.CharField(widget=CKEditorWidget()) class Meta: model = Document fields = ['header', 'body'] # 包含模型中需要通过表单输入的字段
2. 修改views.py的add_document_view
传递表单实例而非类:
def add_document_view(request): categories = Category.objects.all() languages = get_language_choices() # 实例化表单,而非直接传类 context = {"allCategories":categories, "form":PostForm(), "languages":languages} return render(request, "documents/add-document.html", context)
3. 修改views.py的add_document函数
正确验证表单并处理数据:
def add_document(request): if request.method == "POST": form = PostForm(request.POST) # 先验证表单,触发数据清理流程 if form.is_valid(): # 生成Document实例但暂不保存到数据库 document = form.save(commit=False) # 关联分类字段 category_id = request.POST["category"] document.category = Category.objects.get(id=category_id) # 保存到数据库 document.save() return HttpResponseRedirect(reverse("core:category", kwargs={"id":category_id})) # 表单验证失败时返回添加页面(可根据需求调整逻辑) return redirect('core:add_document_view') # 替换为你的GET页面路由名称
为什么Admin面板正常?
Django Admin会自动为模型生成合规的ModelForm,并自动处理表单验证、数据清理和模型保存的完整流程,不会出现手动赋值的错误。
内容的提问来源于stack exchange,提问作者user21251189
相关产品推荐
相关产品推荐

