<p>对<em>reverse</em>的Shell调用(如上所述)非常适合调试这些问题,但有两个关键条件:</p>
<ul>
<li>必须提供与视图需要的任何参数匹配的参数</li>
<li>这些<strong>参数必须与regexp模式匹配。</li>
</ul>
<p>是的,这是合乎逻辑的。是的,这也很混乱,因为<em>reverse</em>只会抛出异常,不会给您任何进一步的提示。</p>
<p>URL模式示例:</p>
<pre><code>url(r'^cookies/(?P<hostname>[^/]+)/(?P<url_id>\d+)/$', 'register_site.views.show_cookies', name='show_cookies'),
</code></pre>
<p>然后在shell中发生了什么:</p>
<pre><code>>>> from register_site.views import show_cookies
>>> reverse(show_cookies)
NoReverseMatch: Reverse for 'register_site.views.show_cookies' with arguments '()' and keyword arguments '{}' not found.
</code></pre>
<p>它不起作用,因为我没有提供任何参数。</p>
<pre><code>>>> reverse('show_cookies', kwargs={'url_id':123,'hostname': 'aaa'})
'/cookies/aaa/123'
</code></pre>
<p>现在成功了,但是。。。</p>
<pre><code>>>> reverse('show_cookies', kwargs={'url_id':'x','hostname': 'www.dupa.com'})
NoReverseMatch: Reverse for 'show_cookies' with arguments '()' and keyword arguments '{'url_id': 'x', 'hostname': 'www.dupa.com'}' not found.
</code></pre>
<p>现在它不工作了,因为<em>url_id</em>与regexp(预期为数字,提供了字符串)不匹配。</p>
<p>您可以将<em>reverse</em>与位置参数和关键字参数一起使用。语法为:</p>
<pre><code>reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None)
</code></pre>
<p>当谈到<em>url</em>模板标记时,有一点很有趣。Django<a href="https://docs.djangoproject.com/en/dev/topics/http/urls/#naming-url-patterns" rel="noreferrer">documentation</a>给出了使用带引号的视图名称的示例:</p>
<blockquote>
<p>{% url 'news.views.year_archive' yearvar %}</p>
</blockquote>
<p>所以我在我的HTML模板中以类似的方式使用了它:</p>
<blockquote>
<p>{% url 'show_cookies' hostname=u.hostname url_id=u.pk %}</p>
</blockquote>
<p>但这对我不起作用。但异常消息给了我一个可能出错的提示-请注意视图名称周围的双引号:</p>
<blockquote>
<p>Reverse for ''show_cookies'' with arguments...</p>
</blockquote>
<p>当我删除引号时,它开始工作:</p>
<blockquote>
<p>{% url show_cookies hostname=u.hostname url_id=u.pk %}</p>
</blockquote>
<p>这让人很困惑。</p>