Django错误反向'论坛',参数'('',)'和关键字参数'{}'找不到

时间:2013-02-17 13:26:42

标签: django

我正在使用本教程制作一个简单的论坛http://lightbird.net/dbe/forum1.html

我遇到这个错误,我不知道该怎么做。你能帮我解决这个错误

  NoReverseMatch at /forum/post/reply/1/

  Reverse for 'forum' with arguments '('',)' and keyword arguments '{}' not found.

  Request Method:   GET
  Request URL:  http://127.0.0.1:8000/forum/post/reply/1/
  Django Version:   1.4.3
  Exception Type:   NoReverseMatch
  Exception Value:  

  Reverse for 'forum' with arguments '('',)' and keyword arguments '{}' not found.

  Exception Location:   C:\Python26\Lib\site-packages\django\template\defaulttags.py in render, line 424
  Python Executable:    C:\Python26\python.exe

  Error during template rendering

  In template C:\djcode\mysite\forum\templates\forum\post.html, error at line 1
  Reverse for 'forum' with arguments '('',)' and keyword arguments '{}' not found.


  1     <a href="{% url ben:forum forum_pk %}">&lt;&lt; back to list of topics</a>

我的Post.html是

  <a href="{% url ben:forum forum_pk %}">&lt;&lt; back to list of topics</a>

我的观点是:

 from django.core.urlresolvers import reverse
 from mysite.settings import MEDIA_ROOT, MEDIA_URL
 from forum.models import Forum
 from django.shortcuts import render_to_response
 from forum.models import Thread
 from django.core.paginator import Paginator, InvalidPage, EmptyPage
 from django.core.context_processors import csrf
 from forum.models import Post

 def main(request):
     """Main listing."""
     forums = Forum.objects.all()
     return render_to_response("forum/list.html", dict(forums=forums,   user=request.user))
 def forum(request, pk):
          """Listing of threads in a forum."""
     threads = Thread.objects.filter(forum=pk).order_by("-created")
     threads = mk_paginator(request, threads, 20)
     return render_to_response("forum/forum.html", add_csrf(request, threads=threads, pk=pk))
 def thread(request, pk):
     """Listing of posts in a thread."""
     posts = Post.objects.filter(thread=pk).order_by("created")
     posts = mk_paginator(request, posts, 15)
     title = Thread.objects.get(pk=pk).title
     return render_to_response("forum/thread.html", add_csrf(request, posts=posts, pk=pk,
         title=title, media_url=MEDIA_URL))
 def add_csrf(request, ** kwargs):
     d = dict(user=request.user, ** kwargs)
     d.update(csrf(request))
     return d

 def mk_paginator(request, items, num_items):
     """Create and return a paginator."""
     paginator = Paginator(items, num_items)
     try: page = int(request.GET.get("page", '1'))
     except ValueError: page = 1

     try:
         items = paginator.page(page)
     except (InvalidPage, EmptyPage):
         items = paginator.page(paginator.num_pages)
     return items
 def post(request, ptype, pk):
     """Display a post form."""
     action = reverse("ben:%s" % ptype, args=[pk])
     if ptype == "new_thread":
         title = "Start New Topic"
         subject = ''
     elif ptype == "reply":
         title = "Reply"
         subject = "Re: " + Thread.objects.get(pk=pk).title

     return render_to_response("forum/post.html", add_csrf(request, subject=subject,
    action=action, title=title))
 def new_thread(request, pk):
     """Start a new thread."""
     p = request.POST
     if p["subject"] and p["body"]:
         forum = Forum.objects.get(pk=pk)
         thread = Thread.objects.create(forum=forum, title=p["subject"], creator=request.user)
         Post.objects.create(thread=thread, title=p["subject"], body=p["body"], creator=request.user)
     return HttpResponseRedirect(reverse("ben:forum", args=[pk]))

 def reply(request, pk):
     """Reply to a thread."""
     p = request.POST
     if p["body"]:
         thread = Thread.objects.get(pk=pk)
         post = Post.objects.create(thread=thread, title=p["subject"], body=p["body"],
             creator=request.user)
     return HttpResponseRedirect(reverse("ben:thread", args=[pk]) + "?page=last")

我的网址:

 from django.conf.urls import patterns,include,url
 from django.contrib import admin
 from django.conf import settings

 urlpatterns = patterns('forum.views',
                        url(r'^$','main',name='main'),
                        url("^forum/(\d+)/$", "forum",name ="forum"),
                        url("^thread/(\d+)/$","thread",name = "thread"),
                        url(r"^post/(new_thread|reply)/(\d+)/$", "post",name = "post"),
                        url(r"^reply/(\d+)/$", "reply" , name ="reply"),
                        url(r"^new_thread/(\d+)/$", "new_thread" , name ="new_thread"),
 )

2 个答案:

答案 0 :(得分:0)

这有点令人困惑'('',)'意味着url参数列表由一个空字符串组成,就像模板是{% url ben:forum '' %}一样。如果没有您的视图代码,就无法知道它是如何发生的。

既然你发布了所有观点,我们仍然不知道哪一个导致了错误:)但我们知道的是,没有一个传递forum_pk上下文变量为render_to_response

post吗?您需要找出论坛pk并将其传递给您的模板:

 def post(request, ptype, pk):
     """Display a post form."""
     action = reverse("ben:%s" % ptype, args=[pk])
     if ptype == "new_thread":
         title = "Start New Topic"
         subject = ''
         forum_pk = pk
     elif ptype == "reply":
         title = "Reply"
         thread = Thread.objects.get(pk=pk)
         forum_pk = thread.forum.pk
         subject = "Re: " + thread.title

     return render_to_response("forum/post.html", add_csrf(request, subject=subject,
         action=action, title=title, forum_pk=forum_pk))

我不赞成这种post视图设计,其中pk表示不同的内容,具体取决于ptype。但是,如果ptypenew_thread,则我们已forum_pkpk。如果是reply,我们需要通过Thread获取pk,并将帖子的论坛pk设为forum_pk

答案 1 :(得分:0)

除了添加forum_pk = pk

之外

我调整了一个回复:

forum_pk = Thread.objects.get(pk = pk).forum.pk