【问题标题】:Django newbie - NoReverseMatch errorsDjango 新手 - NoReverseMatch 错误
【发布时间】:2009-09-12 12:41:36
【问题描述】:

刚开始使用 Django,但遇到了一点困难 - 我决定尝试编写一个简单的博客引擎,同时参考 django-basic-apps 库。

在 blog/urls.py 中,我有这个条目按日期映射到实际的帖子,例如博客/2009/aug/01/test-post

urlpatterns = patterns('',
    url(r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$', 'blog.views.post_detail'),
    ...

以及渲染帖子的视图:

def post_detail(request, slug, year, month, day, **kwargs):
return date_based.object_detail(
    request,
    year = year,
    month = month,
    day = day,
    date_field = 'created_at',
    slug = slug,
    queryset = Content.objects.filter(published=True),
    **kwargs
)

在模型中,我实现了 get_absolute_url,这样我就可以在主博客页面上单击帖子标题来查看它:

class Content(models.Model):
    ...
@permalink
def get_absolute_url(self):
    return ('blog.views.post_detail', (), {
        'slug': self.slug,
        'year': self.created_at.year,
        'month': self.created_at.strftime('%b').lower(),
        'day': self.created_at.day
    })

最后,在主页的帖子列表中,应该在标题中插入永久链接:

{% for content in object_list %}
<div class="content_list">
<h3 class="content_title"><a href="{{ content.get_absolute_url }}">{{ content.title }}</a></h3>
<p class="content_date">{{ content.published_at|date:"Y F d"}}</p>
<p class="content_body">{{ content.body }}</p>
<p class="content_footer">updated by {{ content.author }} at {{ content.updated_at|timesince }} ago</p>
</div>
{% endfor %}

但是链接显示为空,当我尝试从 django shell 调用 content.get_absolute_url() 时,会抛出错误:

NoReverseMatch: Reverse for '<function post_detail at 0xa3d59cc>' with arguments '()' and keyword arguments '{'year': 2009, 'slug': u'another_test', 'day': 15, 'month': 'aug'}' not found.

编辑:原来是 Python 命名空间问题(见下文)。但无论如何,我上面显示的 urls.py 不正确吗?

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    谷歌搜索其他新手 Django 教程,并想到将所有 URL 放入父文件夹 urls.py,这似乎解决了问题。 :) 所以最后,我的主要 urls.py 现在有了:

    from djangoblog.blog import views
    urlpatterns = patterns('',
    
        (r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$',
        views.post_detail),
        (r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{1,2})/$',
        views.post_archive_day),
        ...
    

    编辑:编辑:经过 2 天的随意黑客攻击,幸运的是,我现在对 URLconfs + django 的视图有了更好的理解。 :) 我已将模式移回 blog/urls.py,摆脱了所有基于日期的自定义视图,改为从 urls.py 调用它们,并为需要@permalinked 的项目正确命名模式。

    urls.py 带有命名模式:

    from blog import views
    ...
    (r'(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$',
        'object_detail', dict(info_dict, slug_field='slug', month_format='%m'),
        'post_detail'),
    ...
    (r'category/(?P<slug>[-\w]+)/$', views.category_detail),
    

    models.py:

    class Post:
        @permalink
        def get_absolute_url(self):
        return ('post_detail', (), {
                      ....
    
    class Category:
        @permalink
    def get_absolute_url(self):
        return ('blog.views.category_detail', (), {'slug': self.slug})
    

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 1970-01-01
      • 2015-10-24
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      相关资源
      最近更新 更多