Django报错:Reverse for 'new_entry'参数为空,请求排查
Django Reverse for 'new_entry' 错误修复方案
核心问题总结
你遇到的Reverse for 'new_entry' with arguments '("")' not found错误,本质是模板变量传递错误+URL路由语法混用+视图函数拼写/参数错误共同导致的,下面逐一给出修复方案:
1. 模板中topic_id变量不存在
在topic视图函数中,传递给模板的上下文只有topic和entries,没有topic_id这个变量,模板调用{% url 'test_logs:new_entry' topic_id %}时自然取不到值,传入空字符串导致路由反转失败。
修复topic.html:
将模板中的topic_id替换为topic.id(直接从topic对象获取ID属性):
<p> <a href="{% url 'test_logs:new_entry' topic.id %}">add new entry</a> </p>
2. URL路由语法混用错误
你使用了re_path(旧版url函数),但混用了path函数的<int:topic_id>语法,re_path需要用正则表达式捕获参数。
修复urls.py:
修改new_entry的路由规则为正则格式:
from django.urls import re_path as url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^topics/$', views.topics, name='topics'), url(r'^topics/(?P<topic_id>\d+)/$', views.topic, name='topic'), url(r'^new_topic/$', views.new_topic, name='new_topic'), # 修复为正则捕获格式 url(r'^new_entry/(?P<topic_id>\d+)/$', views.new_entry, name='new_entry'), ]
如果你的Django版本是2.0+,更推荐使用path函数(语法更直观),修改后完整的urls.py:
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('topics/', views.topics, name='topics'), path('topics/<int:topic_id>/', views.topic, name='topic'), path('new_topic/', views.new_topic, name='new_topic'), path('new_entry/<int:topic_id>/', views.new_entry, name='new_entry'), ]
3. 视图函数中的两处低级错误
- 拼写错误:
form.is_vaild()少写了一个字母d,应该是form.is_valid() - 重定向参数错误:
return redirect('test_logs:topic', topic_id==topic_id)中的topic_id==topic_id是布尔值True,应该直接传入topic_id
修复views.py中的new_entry函数:
def new_entry(request, topic_id): """Add a new entry for a particular topic""" topic = Topic.objects.get(id=topic_id) if request.method != 'POST': # No data submitted; create a blank form. form = EntryForm() else: # POST data submitted; process data. form = EntryForm(data=request.POST) if form.is_valid(): # 修复拼写错误 new_entry = form.save(commit=False) new_entry.topic = topic new_entry.save() return redirect('test_logs:topic', topic_id) # 修复重定向参数 context = {'topic': topic, 'form': form} return render(request, 'test_logs/new_entry.html', context)
4. new_entry.html中的无效链接和表单缺失
模板中的返回链接{% url '?' %}>是无效语法,且缺少表单提交逻辑,导致无法提交新条目。
修复new_entry.html:
{% extends "test_logs/base.html" %} {% block content %} <p><a href="{% url 'test_logs:topic' topic.id %}">{{ topic }}</a></p> <p>Add a new entry:</p> <!-- 补充表单标签和提交按钮 --> <form action="{% url 'test_logs:new_entry' topic.id %}" method="post"> {% csrf_token %} {{ form.as_div }} <button type="submit">add entry</button> </form> {% endblock content %}
内容的提问来源于stack exchange,提问作者ImnotKev
相关产品推荐
相关产品推荐

