在Django

时间:2017-04-21 20:06:57

标签: python django slug slugify

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

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

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

这是在urls.py还是views.py(在项目中,而不是app)? 非常感谢。希望这是可以理解的。

1 个答案:

答案 0 :(得分:0)

这并不难。真。

在url-configs中,每个条目只是一个正则表达式,必须匹配最终用户访问的URL。 r'^main/(?P<slug>[-\w]+)/'例如会与: http://localhost:8000/main/some-slug/

匹配

您可以在正则表达式中使用一种特殊的语法来提取匹配的数据,并将该数据作为变量传递给您的视图函数。

这样做的位是(?P<slug>[-\w]+)它将匹配的单词(在本例中为slug)放入一个名为 slug 的变量(<slug>部分,它定义变量名称)。在这个简陋的例子中,slug变量将被设置为&#34; some-slug&#34;。

您可以在视图中访问该变量,如下所示:

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

但为什么我会在模特中看到slu ::?

slug(或命名变量,来自url&#39;拦截&#39;)可用于任何事情。通常,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')

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