擅长:python、mysql、java
<p>url模式按照定义它们的顺序进行检查</p>
<p>所以在这里:</p>
<pre><code>urlpatterns = [
url(r'(?P<post_id>[^/]+)', GenreDetail.as_view(), name = 'post'),
url(r'(?P<post_id>[^/]+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
]
</code></pre>
<p>…正在匹配第一个模式(因为它不以<code>$</code>结尾,所以只忽略多余的段)</p>
<p>…而该模式只传递一个关键字arg</p>
<p>通常,让多个url模式指向同一个视图是一个坏主意。如果可能的话,您应该尝试创建一个regex(例如使用<a href="http://www.regular-expressions.info/optional.html" rel="noreferrer">optional groups</a>),用于处理特定视图的url的各种情况。这样就更明确了。</p>
<p>另一方面,简单地颠倒模式的顺序,将更明确的模式放在第一位也可以工作,而且是正确的(这是urlpatterns的Django规则!)</p>
<pre><code>urlpatterns = [
url(r'(?P<post_id>[^/]+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
url(r'(?P<post_id>[^/]+)', GenreDetail.as_view(), name = 'post'),
]
</code></pre>
<p>正如@ozgur提到的,您还需要通过设置<a href="https://docs.djangoproject.com/en/1.8/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.pk_url_kwarg" rel="noreferrer">^{<cd4>}</a>告诉视图使用<code>post_id</code>,而不是<code>pk</code></p>