最近在学习《python 从入门到精通》第19章,进行环境搭建时出现了一个错误,python 版本:3.7.4,django 版本:2.2.5
NoReverseMatch at /new_entry/2
Reverse for 'topic' with arguments '('',)' not found. 1 pattern(s) tried: ['topic/(?P<topic_id>[0-9]+)$'],截图如下:
错误里显示找不到带有"(")"参数的topic,尝试使用'topic/<int:topic_id>'来匹配。虽然图中显示报错在base.html,但此错误还是出现在new_entry.html,其源码如下:
{% extends "learning_logs/base.html" %}
{%block content %}
<p><a href="{%url 'learning_logs:topic' topic_id %}"> {{ topic }} </a></p>
<p>Add a new entry:</p>
<form action ="{%url 'learning_logs:new_entry' topic.id %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<button name='submit'>add entry </button>
</form>
{% endblock content %}
其中第4行使用到了topic_id,第8行使用的topic.id(已标红),使用topic_id的视图分别是topic和new_entry视图,topic_id是两个视图里面的形参。出现此错误的原因是一是在new_entry视图里未传送topic_id,导致topic_id被认为是无效参数,二是使用topic.id自动识别ID参数(在topic视图和new_entry视图里,topic=Topic.objects.get(id=topic_id))。所以解决方法有两个
(1)修改new_entry视图,将topic_id参数传过来,即将context={'topic':topic,'form':form}修改为context={'topic':topic,'form':form,'topic_id':topic_id},render函数保持不变
(2)修改第4行topic_id为topic.id 。此是书中的写法