NoReverseMatch在/

时间:2017-03-04 20:17:40

标签: python django django-templates

我收到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 %}

1 个答案:

答案 0 :(得分:0)

在您的模板中,posts - 顾名思义 - 是一个查询集,即BlogPost对象列表。该查询集没有id属性;只列出该列表中的各个帖子。

如果您想要链接到特定帖子,则需要遍历该列表,并使用循环中每个帖子的id

{% for post in posts %}
<p>
<a href="{% url 'blogs:edit_posts' post.id %}">edit post</a>
</p>
{% endfor %}