在 Django 中在哪里定义没有 model.py 的 slug

where to define a slug without a model.py in Django

我是 django 的新手,正在寻找在创建没有模型的后端时在 django 中定义 slug 的位置。 url 是这样创建的:

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

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

这是在 urls.py 中还是在 views.py 中(在项目中,而不是应用程序中)? 太感谢了。希望这是可以理解的。

不难。真的。

在 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))

详细了解 fiddle 和正则表达式

http://www.regexr.com

但为什么我看到模型中使用了 slug?:

一个 slug(或命名变量,来自 url 'interception')可以用于任何事情。通常 slug 变量本身将用于检索某种数据库记录......这涉及使用模型。

你可以为所欲为;添加东西,减去东西,大写等等。天空是极限。

来自 Django 文档:

https://docs.djangoproject.com/en/1.10/topics/http/urls/#named-groups

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')

实际上,这意味着您的 URLconf 稍微更明确并且不太容易出现参数顺序错误 – 您可以在视图的函数定义中重新排序参数。当然,这些好处是以简洁为代价的。一些开发人员发现命名组语法丑陋且过于冗长。