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

Django新手集成django-summernote创建博客表单出现AttributeError求助

问题根因

你的视图函数名BlogPostForm和forms.py中定义的表单类名完全重名,导致调用时发生命名冲突,没有正确调用到表单类,反而递归调用了视图函数本身。

请求进入视图函数后,执行form = BlogPostForm(request.POST)时,Python会优先使用当前作用域下的视图函数BlogPostForm,而不是你导入的表单类:相当于把request.POST作为视图函数的第一个参数(本应接收request对象)传入,第二次执行到该行时,参数已经变成了QueryDict类型的request.POST对象,访问这个对象的.POST属性自然不存在,就出现了'QueryDict' object has no attribute 'POST'的报错;GET请求下request.POST是None,就会报'NoneType' object has no attribute 'POST'的错误。

修复步骤

  1. 修改视图函数名,避免和表单类重名,同时同步修改urls.py中对应路径的视图引用
  2. 补充标准表单处理逻辑,区分GET和POST请求,POST请求校验通过后再保存数据
  3. 确保views.py中已经正确导入你写的BlogPostForm表单类

修复后的views.py代码

from django.shortcuts import render, redirect
# 导入你定义的表单类
from .forms import BlogPostForm

# 视图函数改名,避免和表单类重名
def create_blog_post(request):
    if request.method == 'POST':
        # POST请求用提交数据初始化表单
        form = BlogPostForm(request.POST)
        # 校验通过则保存数据,跳转至列表页(可替换为你自己的跳转路径)
        if form.is_valid():
            form.save()
            return redirect('/blog/')
    else:
        # GET请求返回空表单
        form = BlogPostForm()
    return render(request, 'create_post.html', {'form': form})

额外注意事项

  • 检查models.py的字段定义,content_html = TextField(max_length=12000)需要改为content_html = models.TextField(max_length=12000),确保你已经正确导入了django的models模块。
  • 检查urls.py中/blog/create/blog-post对应的路由配置,视图名称要同步修改为create_blog_post,示例如下:
from django.urls import path
from . import views

urlpatterns = [
    # 其他原有路径
    path('create/blog-post/', views.create_blog_post, name='create_blog_post'),
]

内容的提问来源于stack exchange,提问作者SnipeArt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:42:03