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

Django中CKEditor表单提交后保存为textarea而非编辑内容的问题

问题解决步骤

核心问题分析

  1. 表单类定义错误:使用forms.Form却添加Meta关联模型,不符合Django表单规范,应改用ModelForm来匹配模型字段。
  2. 视图数据处理错误:创建Document对象时直接将整个表单对象赋值给body字段,导致保存的是表单对象的字符串表示(含textarea标签),而非CKEditor编辑内容。
  3. 表单实例化错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:24:54