【问题标题】:URL pattern in django with first part as variabledjango 中的 URL 模式,第一部分作为变量
【发布时间】:2026-01-18 03:05:01
【问题描述】:

创建如下 URL 模式很容易

url(r'^member/(?P<member_name>[a-z]+)/$', views.get_member, name='get_member'),

这将生成完整的网址为http://example.com/member/john/,但我想制作类似http://example.com/john/ 的网址。我应该为此制作什么 URL 模式?如果我这样做了

url(r'^(?P<member_name>[a-z]+)/$', views.get_member, name='get_member'),

它将开始匹配其中的所有其他 url。

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    您是正确的,添加诸如url(r'^(?P&lt;member_name&gt;[a-z]+)/$', views.get_member, name='get_member') 之类的网址将匹配所有网址。重要的是 URL 出现的顺序。

    在您的 urls.py 文件中,将您的 get_member 网址放在 urls.py 网址列表的底部。

    这样它将是最后一个匹配的模式。

    例如,以下 url 模式将匹配:

    • 文章/
    • 文章/2003
    • 约翰/
    • 史蒂夫/

      urlpatterns = [
          url(r'^articles/2003/$', views.special_case_2003),
          url(r'^articles/([0-9]{4})/$', views.year_archive),
          url(r'^(?P<member_name>[a-z]+)/$', views.get_member, name='get_member')
      ]
      

    现在可能存在一些您可能知道也可能不知道的问题。如果用户使用名称articles 加入您的站点怎么办? Url 将匹配第一个 url 实例。这意味着“article”用户将永远无法访问那里的个人资料。

    要解决此问题,您将必须拥有一些无法使用的受限用户名。您还需要确保添加到站点的任何新页面都不会与已创建的用户名冲突。

    【讨论】: