Django点击归档按钮出现Method Not Allowed (POST)错误求助
解决Django归档功能的"Method Not Allowed (POST)"错误
先看你的错误日志:POST请求发送到了/product/chair/,但这个路径对应的视图(应该是产品详情页视图)并不支持POST方法,所以返回405错误。而你的表单明明指定了提交到to_archive对应的URL,说明这里有几个关键问题需要逐一修正:
1. 表单实际提交路径不符合预期
错误信息显示请求落在了/product/chair/,但你的表单应该提交到/to_archive/。先排查模板中的URL渲染问题:
- 在浏览器中打开产品页面,右键查看页面源码,确认表单的
action属性是否为/to_archive/。如果不是,可能是{% url 'to_archive' %}语法解析失败——比如你的项目有多个应用,存在URL名称冲突,这时需要给URL添加命名空间,模板里写成{% url '你的应用名:to_archive' %}。
2. Model字段与视图逻辑不匹配
你的Product模型里归档状态字段是is_archived,但视图里却在操作不存在的is_active字段!这会导致逻辑完全失效,赶紧修正views.py:
def to_archive(request): if request.method == 'POST': product_id = request.POST['to_archive'] try: product_archive = Product.objects.get(id=product_id) # 替换成模型中实际的is_archived字段 if not product_archive.is_archived: product_archive.is_archived = True # 要调用timezone.now()方法,不能直接引用方法本身 product_archive.archived_date = timezone.now() product_archive.save() # 归档完成后重定向到合适页面,比如产品列表 return redirect('home') except Product.DoesNotExist: # 处理产品不存在的异常情况 pass # 处理非POST请求(比如用户直接访问/to_archive/) return redirect('home')
3. 表单隐藏字段值错误
你表单里的隐藏字段写的是value="{{ object }}",这里的object是Product实例,直接输出会变成对象的字符串表示(比如<Product: Chair>),而不是产品ID!必须改成传递ID:
<form action="{% url 'to_archive' %}" method="POST"> {% csrf_token %} <input type="hidden" name="to_archive" value="{{ object.id }}"> <input id="disactive_button" type="submit" class="btn btn-primary" value="To archive"> </form>
把这些问题都修正后,再测试归档功能,应该就能解决405错误和逻辑失效的问题了。
内容的提问来源于stack exchange,提问作者jpar
相关产品推荐
相关产品推荐

