NoReverseMatch - 简单的Django论坛应用程序

时间:2014-01-27 16:57:06

标签: python django django-templates django-views django-urls

我正在尝试创建一个简单的论坛应用程序并收到此错误。我倾向于认为这可能与我的URLConf或我使用URL模板标记生成每个线程的URL的方式有关。

/forums/urls.py

# ex: /forums/general_forum
url(r'^(?P<forum_slug>[-\w\d]+)/$', views.forum, name='forum'),

# ex: /forums/general_forum-1/my_first_thread
url(r'^(?P<forum_slug>[-\w\d]+)/(?P<thread_slug>[-\w\d]+)/$', views.thread, name='thread'),

/forums/views.py

索引视图正常,论坛视图没有。

def index(request):
    context = RequestContext(request)
    forum_list = Forum.objects.order_by("sequence")

    for forum in forum_list:
        forum.url = slugify(forum.title) + "-" + str(forum.id)

    context_dict = {'forum_list': forum_list}
    return render_to_response('forums/index.html', context_dict, context)

@login_required
def forum(request, forum_slug):
    context = RequestContext(request)

    try:
        forum = Forum.objects.get(slug=forum_slug)

        threads = Thread.objects.filter(forum=forum)

        context_dict = {'forum': forum,
                        'threads': threads}

    except Forum.DoesNotExist:
        pass

    return render_to_response('forums/forum.html', context_dict, context)

这是我链接到index.html内的论坛视图的方式。

<a href={% url 'forum' forum.slug %}>{{ forum.title }}</a>

在forum.html中,这就是如何制定链接以查看线程内的帖子。这个:

<a href={% url 'forum' forum.slug %}/{% url 'thread' thread.slug %}>{{ thread.title }}</a>

错误。其中一个主题是'django'

NoReverseMatch at /forums/web-development/

Reverse for 'thread' with arguments '(u'django',)' and keyword arguments '{}' not found. 2 pattern(s) tried: ['forums/(?P<forum_slug>[-\\w\\d]+)/(?P<thread_slug>[-\\w\\d]+)/$', '$(?P<forum_slug>[-\\w\\d]+)/(?P<thread_slug>[-\\w\\d]+)/$']

在错误中,'thread'的url模板标记以红色突出显示,并指​​出在模板渲染过程中出现错误。这个错误对我来说似乎不清楚,我不确定这是否是我使用模板标签或其他方式的问题。

1 个答案:

答案 0 :(得分:2)

您没有在您的网址配置所需的线程网址中传递论坛slugg

<a href={% url 'forum' forum.slug %}/{% url 'thread' thread.slug %}>{{ thread.title }}</a>

您也不应该同时使用这两个网址。相反,你想要的是:

<a href="{% url 'thread' forum.slug thread.slug %}">{{ thread.title }}</a>