Django模板反向匹配treatment_detail URL报NoReverseMatch错误如何解决
报错原因
你遇到的NoReverseMatch报错和urls.py的路由配置本身无关,核心原因是:treatment_detail路由定义了必填路径参数patient_id,你在模板中调用{% url %}反向匹配该路由时,没有传入对应的patient_id参数,导致Django无法生成符合规则的URL。
解决方案
根据你使用这个表单的页面场景,选择对应修改方案:
场景1:表单放在treatment_detail.html页面中
该页面的get_context_data方法已经往模板上下文注入了patient_id变量,直接在模板调用{% url %}时传入参数即可,修改模板代码:
<form action="{% url 'patient:treatment_detail' patient_id=patient_id %}" method="get"> <input type="submit" class="btn btn-primary" value="get_doc" name="get_doc"> </form>
场景2:表单放在新增患者的add.html页面中
新增患者提交前还没有生成patient_id,不能直接反向匹配treatment_detail路由,你原本的逻辑已经在PatientAddView的post方法中处理完表单保存后,自动携带patient_id跳转到treatment_detail页面,这种情况下直接把表单的action改为指向新增患者的路由即可,同时注意补充CSRF校验标签、调整提交方法为POST:
<form action="{% url 'patient:patient_add' %}" method="post"> {% csrf_token %} <input type="submit" class="btn btn-primary" value="get_doc" name="get_doc"> </form>
可选优化建议
你当前urls.py里的patient_id没有指定类型,如果你确定该参数是UUID格式,可以修改路由规则做参数校验,避免非法值进入视图逻辑:
path( route='<uuid:patient_id>/', view=views.TreatmentTemplateView.as_view(), name='treatment_detail'),
内容的提问来源于stack exchange,提问作者RobMcC
相关产品推荐
相关产品推荐

