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'的错误。
修复步骤
- 修改视图函数名,避免和表单类重名,同时同步修改urls.py中对应路径的视图引用
- 补充标准表单处理逻辑,区分GET和POST请求,POST请求校验通过后再保存数据
- 确保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
相关产品推荐
相关产品推荐

