我正在使用本教程制作一个简单的论坛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 %}"><< back to list of topics</a>
我的Post.html是
<a href="{% url ben:forum forum_pk %}"><< 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"),
)
答案 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
。但是,如果ptype
为new_thread
,则我们已forum_pk
为pk
。如果是reply
,我们需要通过Thread
获取pk
,并将帖子的论坛pk
设为forum_pk
。
答案 1 :(得分:0)
除了添加forum_pk = pk
我调整了一个回复:
forum_pk = Thread.objects.get(pk = pk).forum.pk