这并不难。真的。
在 url-configs 中,每个条目只是一个正则表达式,它必须匹配最终用户访问的 url。r'^main/(?P<slug>[-\w]+)/'
例如将匹配:http://localhost:8000/main/some-slug/
您可以在正则表达式中使用一种特殊的语法来提取匹配的数据并将该数据作为变量传递给您的视图函数。
这样做的一点是(?P<slug>[-\w]+)
将匹配的单词(在本例中为 slug)放入一个名为slug的变量中(该<slug>
部分,它定义了变量名)。在这个简陋的例子中,slug 变量将被设置为“some-slug”。
该变量将可以在您的视图中访问,如下所示:
from django.http import HttpResponse
def handle_my_view(request, slug=homepage):
# do stuff with slug
return HttpResponse("I did stuff with slug: {}".format(slug))
了解更多关于正则表达式的信息
在http://www.regexr.com
但是为什么我会看到模型中使用了蛞蝓?:
slug(或命名变量,来自 url 'interception')可以用于任何事情。通常 slug 变量本身将用于检索某种数据库记录......这涉及使用模型。
你可以对他们做任何你想做的事;添加东西,减去东西,大写,等等。天空才是极限。
来自 Django 文档:
https://docs.djangoproject.com/en/1.10/topics/http/urls/#named-groups
命名组
上面的示例使用简单的、未命名的正则表达式组(通过括号)来捕获 URL 的位并将它们作为位置参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获 URL 位并将它们作为关键字参数传递给视图。
在 Python 正则表达式中,命名正则表达式组的语法是 (?Ppattern),其中 name 是组的名称,pattern 是要匹配的某个模式。
这是上面的示例 URLconf,重写为使用命名组:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
这完成了与前一个示例完全相同的事情,但有一个细微的区别:捕获的值作为关键字参数而不是位置参数传递给视图函数。例如:
请求/articles/2005/03/
将调用函数views.month_archive(request, year='2005', month='03')
,而不是views.month_archive(request, '2005', '03')
.
请求/articles/2003/03/03/
将调用该函数views.article_detail(request, year='2003', month='03', day='03')
。
在实践中,这意味着你的 URLconfs 更加明确并且不太容易出现参数顺序错误——并且你可以在视图的函数定义中重新排序参数。当然,这些好处是以简洁为代价的。一些开发人员发现命名组语法丑陋且过于冗长。