2013-03-08 56 views
8

由於某種原因,我似乎無法解決此錯誤。我使用Django 1.5NoReverseMatch - 帶有參數和關鍵字參數的'detail'的反向{}找不到

實際的錯誤我得到的是

Reverse for 'detail' with arguments '()' and keyword arguments '{u'slug': u'third-post'}' not found. 

在我projest DIR我有這個urls.py

from django.conf.urls import patterns, include, url 

# Uncomment the next two lines to enable the admin: 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
    # Examples: 
    # url(r'^$', 'blog.views.home', name='home'), 
    # url(r'^blog/', include('blog.foo.urls')), 

    # Uncomment the admin/doc line below to enable admin documentation: 
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 

    # Uncomment the next line to enable the admin: 
    url(r'^admin/', include(admin.site.urls)), 

    #include the blogapp url 
    url(r'', include('blogapp.urls', namespace='blog')), 
) 

在我的應用程序文件夾中的urls.py看起來是這樣的

urlpatterns = patterns ('', 

    url(r'^$', 
      ListView.as_view(
        queryset = Post.objects.order_by('-pub_date')[:5], 
        context_object_name = 'latest_posts', 
        template_name = 'blogapp/default.html'), 
      name = 'index' 
     ), 

    url(r'^post/(?P<slug>\w+)/$', 
      PostDetailView.as_view(), 
      name = 'detail' 
     ), 
) 

我交的細節視圖看起來像這樣

class PostDetailView(DetailView): 

    template_name = 'blogapp/post/detail.html' 

    def get_object(self): 
     return get_object_or_404(Post, slug__iexact = self.kwargs['slug']) 

我有這個在我的HTML

{% for p in latest_posts %} 
     <li><a href="{% url 'blog:detail' p.slug %}">{{p.title}}</a></li> 
{% endfor %} 

我可以打開我的殼,我得到一個URL回到

>>> from django.core.urlresolvers import reverse 
>>> reverse('blog:detail', kwargs={'slug':'test'}) 
'/post/test/' 

奇怪的是在我的html這一行工作

<li><a href="{% url 'blog:detail' p.id %}">{{p.title}}</a></li> 

爲什麼會p.id工作,而不是p.slug?

這裏是回溯

Environment: 


Request Method: GET 
Request URL: http://127.0.0.1:8000/ 

Django Version: 1.5 
Python Version: 2.7.2 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'django.contrib.admindocs', 
'south', 
'blogapp') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Template error: 
In template .../Development/Python/Django/dev/blog/blogapp/templates/blogapp/default.html, error at line 11 
    Reverse for 'detail' with arguments '()' and keyword arguments '{u'slug': u'third-post'}' not found. 
    1 : {% extends "blogapp/base.html" %} 


    2 : 


    3 : {% block title %}Blog Posts{% endblock %} 


    4 : 


    5 : {% block body %} 


    6 : 


    7 :  {% if latest_posts %} 


    8 :   <p>Latest 5 blog posts</p> 


    9 :    <ul> 


    10 :     {% for p in latest_posts %} 


    11 :      <li><a href=" {% url 'blog:detail' slug=p.slug %} ">{{p.title}}</a></li> 


    12 :     {% endfor %} 


    13 :    </ul> 


    14 :  {% else %} 


    15 :   <p>No blog posts published.</p> 


    16 :  {% endif %} 


    17 : 


    18 : {% endblock %} 


    19 : 


    20 : 

Traceback: 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    140.      response = response.render() 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/response.py" in render 
    105.    self.content = self.rendered_content 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/response.py" in rendered_content 
    82.   content = template.render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/base.py" in render 
    140.    return self._render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/base.py" in _render 
    134.   return self.nodelist.render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/base.py" in render 
    830.     bit = self.render_node(node, context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    74.    return node.render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    124.   return compiled_parent._render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/base.py" in _render 
    134.   return self.nodelist.render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/base.py" in render 
    830.     bit = self.render_node(node, context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    74.    return node.render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/loader_tags.py" in render 
    63.    result = block.nodelist.render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/base.py" in render 
    830.     bit = self.render_node(node, context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    74.    return node.render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/defaulttags.py" in render 
    284.     return nodelist.render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/base.py" in render 
    830.     bit = self.render_node(node, context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/debug.py" in render_node 
    74.    return node.render(context) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/defaulttags.py" in render 
    188.       nodelist.append(node.render(context)) 
File ".../.virtualenvs/env1/lib/python2.7/site-packages/django/template/defaulttags.py" in render 
    424.       raise e 

Exception Type: NoReverseMatch at/
Exception Value: Reverse for 'detail' with arguments '()' and keyword arguments '{u'slug': u'third-post'}' not found. 
+0

嘗試使用'{%URL的博客:細節'塞= p.slug%}' – Rohan 2013-03-08 04:59:57

+0

我試過{%url'博客:細節'slug = p.slug%}它沒有用。相同的錯誤 – iJK 2013-03-08 05:02:28

+0

您是否使用調試視圖來檢查p.slug的內容? – 2013-03-08 05:11:20

回答

18

因爲你的URL編碼不支持這個字符 「 - 」,它必須是

url(r'^post/(?P<slug>[\w\-]+)/$', 
     PostDetailView.as_view(), 
     name = 'detail' 
    ), 
+0

很好的抓住這裏! – 2013-03-08 05:33:39

+0

謝謝!.. :) – princess 2013-03-08 05:34:56

+0

非常感謝你:-) – iJK 2013-03-08 11:49:29

相關問題