0

我对 django 相当陌生,并且正在寻找在创建没有模型的后端时在 django 中定义 slug 的位置。网址是这样创建的:

url(r'^main/(?P<slug>[-\w]+)/', include('main.urls')),

我在每个视图函数中定义的 main.urls 中有 slug。我不确定在哪里定义这个 slug(链接,不管你怎么称呼它)。在其他 django slug 示例中,常见的方式是在模型中,我目前正在与程序交谈,而不是创建自己的模型。

这会在 urls.py 或 views.py 中(在项目中,而不是应用程序中)吗?非常感谢。希望这是可以理解的。

4

1 回答 1

0

这并不难。真的。

在 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 更加明确并且不太容易出现参数顺序错误——并且你可以在视图的函数定义中重新排序参数。当然,这些好处是以简洁为代价的。一些开发人员发现命名组语法丑陋且过于冗长。

于 2017-04-21T22:06:46.337 回答