将Django url模板标记与可选参数一起使用时出现NoReverseMatch错误,但在浏览器中访问URL时则不是

时间:2014-06-20 17:38:40

标签: python django url django-templates

我有一个需要考虑以下模式的网址:

  • 本地主机:8000 /人员配置机构
  • localhost:8000 / staffing-agencies / 90210(邮政编码)
  • localhost:8000 / staffing-agencies / portland-or(city-state)

当我在浏览器中输入任何这些网址时,它们都按预期工作。但是,当我尝试从Django的网址模板标记引用此网址时,我收到NoReverseMatch错误。

以下是我的相关url.py文件:

# From urls.py
urlpatterns = patterns('',
    url(r'^', include('bos.apps.search.urls', namespace='search',
                       app_name='search')),
)

# From search/urls.py
urlpatterns = patterns('bos.apps.search',
    url(r'^staffing-agencies/'
        r'((?P<city>[a-zA-Z]+)-(?P<state>[a-zA-Z]{2}))?'
        r'((?P<zip>[0-9]{5}))?$',
        'views.main', name='main'),
)

我认为这可能与可选参数有关,但所有这些差异都会导致NoReverseMatch错误:

<a href="{% url "search:main" zip=97214 %}">Test</a>
<a href="{% url "search:main" city="portland" state="or" %}">Test</a>

此差异不会引发错误:

<a href="{% url "search:main" %}">Test</a>

我正在使用Django 1.6.5

1 个答案:

答案 0 :(得分:1)

这不是更好的解决方案,这是解决方案之一

url(r'^staffing-agencies/(?P<city>[a-zA-Z]+)*-(?P<state>[a-zA-Z]{2})*?(?P<zip>[0-9]{5})*?$',
        'views.main', name='main'),

在观点中:

def main(request, city=None, state=None, zip=None):

in html:

<a href="{% url "search:main"  city='sadasd' state='ds' zip=12345 %}">Test</a>

在这种情况下,url就像这样工作,

  • 本地主机:8000 /人员配置机构
  • localhost:8000 / staffing-agencies / -90210(邮政编码)
  • localhost:8000 / staffing-agencies / portland-or(city-state)