我收到NoReverse匹配错误。我已经阅读了几篇关于此的帖子以找到答案,但我没有看到解决方案。
这是一个简单的博客webapp,用于按时间顺序显示帖子。该错误与“views.py”中的edit_post函数有关。我怀疑这个错误与在修改帖子时尝试将posts.id存储为参数有关。我已经尝试删除下面违规行中的post.id,它将加载页面。问题是如果我这样做,我就无法加载页面以便在此之后编辑特定的帖子。
我不明白我错过了什么。我查看了一些处理此错误的帖子,我无法确定具体方案的问题。很感谢任何形式的帮助。
我的错误:
> 的NoReverseMatch使用参数'('',)'和关键字参数'{}'>找不到'edit_posts'的反转。尝试了1种模式:['edit_posts(?P \ d +)/']
以下是主页中的违规行“index.html”:
<p>
<a href="{% url 'blogs:edit_posts' posts.id %}">edit post</a>
</p>
索引视图:
def index(request):
"""The home page for Blog."""
posts = BlogPost.objects.order_by('date_added')
context = {'posts': posts}
return render(request, 'blogs/index.html', context)
我的“urls.py”:
urlpatterns = [
# Home page
url(r'^$', views.index, name='index'),
# url(r'^posts/$', views.posts, name='posts'),
# Page for adding a new post.
url(r'^new_post/$', views.new_post, name='new_post'),
# Page for editing posts.
url(r'^edit_posts(?P<posts_id>\d+)/$', views.edit_posts,
name='edit_posts'),
]
edit_posts视图:
def edit_posts(request, posts_id):
"""Edit an existing post."""
posts = BlogPost.objects.get(id=posts_id)
if request.method != 'POST':
# Initial request; pre-fill form with the current entry.
form = PostForm(instance=posts)
else:
# POST data submitted; process data.
form = PostForm(instance=posts, data=request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('blogs:index',
args=[posts.id]))
context = {'posts': posts, 'form': form}
return render(request, 'blogs/edit_posts.html', context)
“edit_posts.html”页面的模板:
{% extends "blogs/base.html" %}
{% block content %}
<p>Edit an existing post:</p>
<form action="{% url 'blogs:edit_posts' post.id %}" method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name="submit">save changes</button>
</form>
{% endblock content %}
答案 0 :(得分:0)
在您的模板中,posts
- 顾名思义 - 是一个查询集,即BlogPost对象列表。该查询集没有id
属性;只列出该列表中的各个帖子。
如果您想要链接到特定帖子,则需要遍历该列表,并使用循环中每个帖子的id
:
{% for post in posts %}
<p>
<a href="{% url 'blogs:edit_posts' post.id %}">edit post</a>
</p>
{% endfor %}