在使用django form表单出现以下错误
django.urls.exceptions.NoReverseMatch: Reverse for 'new_entry' with arguments '('',)'not found. 1 pattern(s) tried: ['new_entry/(?P<topic_id>\\d+)/$']
功能描述:
想给“指定主题”添加内容实体
请求地址:
http://localhost:8000/new_entry/2
urls:
# 添加新条目url(r'^new_entry/(?P<topic_id>\d+)/$', views.new_entry, name='new_entry'),
定义view:
def new_entry(request, topic_id):'''在特定的主题中添加条目'''topic = Topic.objects.get(id=topic_id)if request.method != 'POST':form = EntryForm()else:# 新增主题内容条目form = EntryForm(data=request.POST)if form.is_valid():context = {'form': form}# 跳转到新增展示界面return render(request, 'learning_logs/new_entry.html', context)
模板 new_entry.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>新增内容</title>
</head>
<body><!-- 继承主页链接 -->{% extends "learning_logs/base.html" %}{% block content %}<p> Add a new entry:</p><!-- 添加一个内容 --><form action="{% url 'learning_logs:new_entry' topic.id %}" method="post">{% csrf_token %}{
{ form.as_p }}<input type="submit" value="add entry"></form>{% endblock %}</form>
</body>
</html>
问题定位经过:
在将模板 <form></form> 表单注释掉之后,发现可以跳转到界面,那么问题可以确定在 form标签包括之内的原因了,debug调试后,view内定义的
new_entry(request, topic_id) 是可以接收浏览器传入的 topic_id。因为是get 请求所以应该直接跳转到新增实体界面。 但是报错,所以问题应该只是在模板html的表单内了。
最终发现:
因为是给指定主题添加内容, 所以需要 topic_id
而此时context之中并没有包含 topic的信息
所以修改view中 new_entry
增加 topic信息再次执行就成功解决了