Django

Django 2 By Example学习笔记

2019-09-25 18:14By sasaky5 Comments

今天开始跟着 柚子小站(http://www.conyli.cc)好好把Django 2 By Example这本书敲下来;为每个视图创建单独的urls.py文件是保持应用可被其他项目重用的最好方式。


blog应用下目录下边新建一个urls.py文件,然后添加如下内容:

from django.urls import path
from . import views

app_name = 'blog'
urlpatterns = [
    # post views
    path('', views.post_list, name='post_list'),
    path('<int:year>/<int:month>/<int:day>/<slug:post>/', views.post_detail, name='post_detail'),
]

上边的代码中,通过app_name定义了一个命名空间,方便以应用为中心组织URL并且通过名称对应到URL上。然后使用path()设置了两条具体的URL pattern。第一条没有任何的参数,对应post_list视图。第二条需要如下四个参数并且对应到post_detail视图:


  • year:需要匹配一个整数

  • month:需要匹配一个整数

  • day:需要匹配一个整数

  • post:需要匹配一个slug形式的字符串



ASCII字符或数字,减号,下划线组成的字符串)的变量传给视图。

对于URL匹配的类型,可以参考https://docs.djangoproject.com/en/2.0/topics/http/urls/#path-converters

如果使用path()无法满足需求,则可以使用re_path(),通过Python正则表达式匹配复杂的URL。参考https://docs.djangoproject.com/en/2.0/ref/urls/#django.urls.re_path了解re_path()的使用方法,参考https://docs.python.org/3/howto/regex.html了解Python中如何使用正则表达式。

为每个视图创建单独的urls.py文件是保持应用可被其他项目重用的最好方式。

现在我们必须把blog应用的URL包含在整个项目的URL中,到mysite目录下编辑urls.py:

from django.contrib import admin
from django.urls import path, includeurlpatterns = [
    path('admin/', admin.site.urls),    
    path('blog/', include('blog.urls', namespace='blog')),]




6.3规范模型的URL

可以使用在上一节创建的post_detail URL来为Post模型的每一个数据对象创建规范化的URL。通常的做法是给模型添加一个get_absolute_url()方法,该方法返回对象的URL。我们将使用reverse()方法通过名称和其他参数来构建URL。编辑models.py文件

from django.urls import reverseclass Post(models.Model):
    # ......    
    def get_absolute_url(self):
        return reverse('blog:post_detail', args=[self.publish.year, self.publish.month, self.publish.day, self.slug])

之后在模板中,就可以使用get_absolute_url()创建超链接到具体数据对象。

译者注:原书这里写得很简略,实际上反向解析URL是创建结构化站点非常重要的内容,可以参考Django 1.11版本的Django进阶-路由系统了解原理,Django 2.0此部分变化较大,需研读官方文档。