Python视图访问request.method报错:'str'对象无'method'属性
解决 'str' object has no attribute 'method' 错误
这个问题我碰到过好多次,核心原因就是命名冲突,咱们一步步拆解清楚:
先看你贴的代码:
from .alphabetize import alphabetize from .forms import WordListForm def alphabetize(request): if request.method == "POST": form = WordListForm(request.POST) # ... 你的其他代码
你先从.alphabetize模块导入了一个叫alphabetize的对象(不管是函数、变量还是字符串),紧接着又定义了一个同名的视图函数。虽然Python语法允许后面的定义覆盖前面的导入,但在Django的模块加载顺序里,很容易出意外:
比如Django启动时,urls.py可能会优先导入main.views.alphabetize,这时候你的视图函数还没定义完成,导入的其实是你从.alphabetize模块拿过来的那个对象。如果那个对象是字符串,或者是个不接受HttpRequest参数的函数,请求进来时Django调用它就会出问题——要么把request传给字符串导致报错,要么参数类型不匹配,最终就出现了你看到的'str' object has no attribute 'method'。
快速修复方案
直接给视图函数改个名字,避开命名冲突就行:
from .alphabetize import alphabetize from .forms import WordListForm # 给函数加个后缀,比如_view,和导入的对象区分开 def alphabetize_view(request): if request.method == "POST": form = WordListForm(request.POST) # ... 你的其他代码 # 剩下的逻辑保持不变
然后去urls.py里把对应的路由更新为指向新函数名:
path('alphabetize/', views.alphabetize_view)
这样一改,命名冲突就消失了,Django能准确找到你的视图函数,传入正确的HttpRequest对象,request.method自然就能正常工作了。
为什么另一个页面没问题?
因为另一个页面的视图函数没有和任何导入的对象重名,模块加载时不会出现混淆,所以Django能正确调用它并传入request对象。
内容的提问来源于stack exchange,提问作者The Latinist
相关产品推荐
相关产品推荐

