在 Django 中使用 % url % 时的 NoReverseMatch

Posted

技术标签:

【中文标题】在 Django 中使用 % url % 时的 NoReverseMatch【英文标题】:NoReverseMatch when using % url % in Django在 Django 中使用 % url % 时的 NoReverseMatch 【发布时间】:2011-05-14 20:12:39 【问题描述】:

我正在关注一本书(Practical Django Projects 2nd Ed.),但遇到了一个我无法弄清楚的错误。

我收到此错误: /weblog/ 处的 TemplateSyntaxError

渲染时捕获 NoReverseMatch:“coltrane_category_list”的反向参数“()”和关键字参数“”未找到。

这是我的模板中使用 % url % 的代码:

    <li id="main-nav-entries">
        <a href="% url coltrane_entry_archive_index %">Entries</a>
    </li>

这是我的 URL 配置:

entry_info_dict = 
    'queryset': Entry.objects.all(),
    'date_field': 'pub_date',


urlpatterns = patterns('django.views.generic.date_based',
    (r'^$', 'archive_index', entry_info_dict, 'coltrane_entry_archive_index'),
    (r'^(?P<year>\d4)/$', 'archive_year', entry_info_dict, 'coltrane_entry_archive_year'),
    (r'^(?P<year>\d4)/(?P<month>\w3)/$', 'archive_month', entry_info_dict, 'coltrane_entry_archive_month'),
    (r'^(?P<year>\d4)/(?P<month>\w3)/(?P<day>\d2)/$', 'archive_day', entry_info_dict, 'coltrane_entry_archive_day'),
    (r'^(?P<year>\d4)/(?P<month>\w3)/(?P<day>\d2)/(?P<slug>[-\w]+)/$', 'object_detail', entry_info_dict, 'coltrane_entry_detail'),
)

错误是什么意思?我没有给它足够的论据吗? % url % 是如何工作的?据我了解,它会查看 URL 配置并找到匹配的关键字,并根据 URL 配置中的匹配关键字返回一个 URL。

【问题讨论】:

【参考方案1】:

您必须在您的模式上使用url 函数才能正确注册该模式的名称。请参阅Django documentation on naming url patterns。

基本上,将您的模式更改为:

urlpatterns = patterns('django.views.generic.date_based',
    url(r'^$', 'archive_index', entry_info_dict, name='coltrane_entry_archive_index'),
    url(r'^(?P<year>\d4)/$', 'archive_year', entry_info_dict, name='coltrane_entry_archive_year'),
    url(r'^(?P<year>\d4)/(?P<month>\w3)/$', 'archive_month', entry_info_dict, name='coltrane_entry_archive_month'),
    url(r'^(?P<year>\d4)/(?P<month>\w3)/(?P<day>\d2)/$', 'archive_day', entry_info_dict, name='coltrane_entry_archive_day'),
    url(r'^(?P<year>\d4)/(?P<month>\w3)/(?P<day>\d2)/(?P<slug>[-\w]+)/$', 'object_detail', entry_info_dict, name='coltrane_entry_detail'),
)

我认为它可以在不使用 name= 作为命名参数的情况下工作,但我总是更喜欢这样做,因为它对我来说更明确。

【讨论】:

以上是关于在 Django 中使用 % url % 时的 NoReverseMatch的主要内容,如果未能解决你的问题,请参考以下文章

编辑时的 Django FormWizard 预填充

WSGIScriptAlias 为 /PREFIX 时的 Django localeURL

Django身份验证和Ajax - 需要登录的URL

% url % 在 Django 中不起作用

有没有办法使用常量替换在 django 模板中的 html 文件中传递 URL 值?

/ password-reset /时的IndexError:重置密码时字符串索引超出范围