Django模板调用edit_post路由出现NoReverseMatch错误如何修复
错误根因
你遇到的报错核心有三个层面的问题:
- 模板渲染时
post.id为空,导致生成url时没有符合要求的参数传入 - URL配置和视图函数参数不匹配
- 视图函数仅支持POST请求,和a标签的GET请求逻辑冲突
修复步骤
1. 先匹配URL与视图的参数规则
你当前urls.py中给edit_post配置了路径参数<str:pk>,但视图函数没有接收该参数,可二选一修改:
- 方案A(适配你当前视图逻辑,推荐):删除URL的路径参数,因为你当前是从POST请求体中拿post id,不需要路径传参
修改urls.py对应行为:
path('edit_post/', views.edit_post, name="edit_post"),
- 方案B:修改视图接收路径参数
修改视图函数定义为:
@login_required @csrf_exempt def edit_post(request, pk): if request.method == "POST": new_post = request.POST.get('text') try: post = Post.objects.get(id=pk) if post.username == request.user: post.text = new_post.strip() post.save() return JsonResponse({}, status=201) except: return JsonResponse({}, status=404) return JsonResponse({}, status=400)
2. 修复模板参数为空问题
当前报错是因为模板循环的Post实例中存在未入库、没有生成id的对象,两种处理方式:
- 检查
profile视图中查询Post列表的逻辑,确保只把已经调用过save()、入库的Post实例传到模板 - 模板渲染时加非空判断,避免空参数:
如果用上面的方案A,修改模板代码为:
<a class="btn btn-sm btn-info" href="javascript:void(0)" data-post-id="{{ post.id|default:'' }}">编辑</a>
如果用方案B,加判断避免空参数:
{% if post.id %} <a class="btn btn-sm btn-info" href="javascript:void(0)" data-post-id="{{ post.id }}">编辑</a> {% endif %}
3. 修复请求逻辑冲突
你当前的edit_post视图仅处理POST请求,直接用a标签跳转是GET请求,会返回400错误,建议绑定AJAX提交请求,示例代码:
document.querySelectorAll('.btn-info').forEach(btn => { btn.addEventListener('click', function() { const postId = this.dataset.postId; const newText = prompt('请输入新的帖子内容'); if (!newText) return; // 方案A的话路径写'/edit_post/',在body里加id参数即可 fetch(`/edit_post/${postId}/`, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value }, body: `text=${encodeURIComponent(newText)}` }).then(res => { if (res.status === 201) location.reload(); else alert('修改失败'); }) }) })
内容的提问来源于stack exchange,提问作者user14567126
相关产品推荐
相关产品推荐

