第二天:Django 基础

URL路由

对于高质量的Web 应用来说,使用简洁、优雅的URL路由是一个非常值得重视的细节。Django 让你随心所欲设计你的URL,不受框架束缚。为了给一个应用设计URL,你需要创建一个Python 模块,通常称为URLconf(URL configuration)。这个模块是纯粹的Python 代码,包含URL 模式(简单的正则表达式)到Python 函数(你的视图)的简单映射。

Django 如何处理一个请求

1. django 加载 ROOT_URLCONF 指定的模块,并寻找可用的urlpatterns.它是django.conf.urls.url() 实例的一个Python 列表。

2. Django 依次匹配每个 URL,在与请求的URL 匹配的第一个url停下来

3. 一旦其中的一个正则表达式匹配上,Django 将导入并调用给出的视图,它是一个简单的

Python 函数(或者一个基于类的视图)。视图将获得如下参数:

    参数一:一个HttpRequest 实例。

    参数二:如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数提供给视图。

    参数三:关键字参数由正则表达式匹配的命名组组成,但是可以被   django.conf.urls.url()   的可选参数kwargs覆盖。

4. 如果没有匹配到正则表达式,或者如果过程中抛出一个异常,Django 将调用一个适当的错误处理视图:handler404, handler500, handler403, handler400

URLconf

URLconf是一个python模块,是一个URL模式(简单正则表达式)到Python函数(视图)之间的映射

urlpatterns

    urlpatterns 是一个 url() 实例类型的Python 列表。

    urlpatterns 中的每个正则表达式在第一次访问它们时被编译

url函数

url(regex, view, kwargs=None, name=None)

regex: 一个字符串(原始字符串)或简单的正则表达式

view: view参数是一个视图函数或as_view()的结果(基于类的视图)

kwargs: 传递额外的参数给视图

name: url名称

include

include(module, namespace=None, app_name=None)

include(pattern_list)

include((pattern_list, app_namespace), namespace=None)

include((pattern_list, app_namespace, instance_namespace))

module: URLconf模块

namespace:URL命名空间

app_name: app的命名空间

pattern_list: 可迭代的django.conf.urls.url()实例

app_namespace: 应用的命名空间

instance_namespace: 实例的命名空间

include 示例

示例1:

urlpatterns = [

  url( r'^$', RedirectView.as_view(url="/dashboard/")),

  url(r'^dashboard/', include("dashboard.urls")),

  url(r'^accounts/', include("accounts.urls")),

  url(r'^admin/', admin.site.urls),

]

示例2:

urlpatterns = [

  url(r"^user/", include([

  url(r'^list/$', view.userlist, name="user_list"),

  url(r'^info/$', view.userinfo, name="userer_inf),

  url(r'^modify/', include([

      url(r'status/$',view.modifystatus, name="user_modify_status"),

    ]))

  ]))

]

url参数—位置参数

若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。

from django.conf.urls import url

from . import views

urlpatterns = [

  url(r'^articles/2003/$', views.special_case_2003),

  url(r'^articles/([0-9]{4})/$', views.year_archive),

  url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),

  url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),

]

请求地址:/articles/2003/03/03/

调用函数:views.article_detail(request, "2003", '03', '03')

url参数——关键字参数

语法:

(?p<name>pattern)

name是传给视图参数的名字,

pattern是一个正则表达式,也是关键字参数的值

示例:

from django.conf.urls import url

from . import views

urlpatterns = [

  url(r'^articles/2003/$', views.special_case_2003),

  url(r'^articles/(?P[0-9]{4})/$', views.year_archive),

  url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),

  url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.article_detail),

]

请求地址:/articles/2003/03/03/

调用函数:views.article_detail(request, year='2003', month='03', day='03').

url参数——额外参数

URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数

django.conf.urls.url() 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递

给视图函数的额外关键字参数

示例:

from django.conf.urls import url

from . import views

urlpatterns = [

  url(r'^blog/(?P[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),

]

请求地址:/blog/2005/

调用函数:views.year_archive(request, year='2005',foo='bar')

URL反向解析

django给每个URL取了一个名字,存储每个URL与name的映射关系

根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。这种方式叫做

反向解析URL、反向URL匹配、反向URL查询或者简单的URL反查。

from django.conf.urls import url

from . import views

urlpatterns = [

  url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),

]

视图中使用:

from django.core.urlresolvers import reverse

year = 2006

return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

模板中使用:

<a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a>

基于类的视图

视图是一个可调用的对象,它接收一个请求然后返回一个响应,这个可调用对象可以不只

是函数,Django提供一些可以用作视图的类。

基于类的视图使用Python 对象实现视图,它提供除函数视图之外的另外一种方式。

View

属性:

  http_method_names

方法:

as_view()

dispatch()

http_method_not_allowed()

类视图登陆验证

from django.contrib.auth.decorators import login_required

from django.utils.decorators import method_decorator

class FooView(View):

@method_decorator(login_required)

def get(request, *args, **kwargs):

return HttpResponse("hello world")

数据分页

分页

Paginator对象

Page对象

Paginator

class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)

Required arguments

- object_list

- per_page

Optional arguments

- orphans

- allow_empty_Òrst_page

属性

- Paginator.count 所有页面的objects总数

- Paginator.num_pages 页面总数

- Paginator.page_range 页码的范围,从1开始,例如[1, 2, 3, 4]

方法

- Paginator.page(number) 返回一个page对象,number, 当前显示的是第几页

Page

class Page(object_list, number, paginator)

属性

- Page.object_list 当前页面的对象列表

- Page.number 当前页的序号,从1开始

- Page.paginator Paginator对象

方法

- Page.has_next() 如果有下一页,返回True

- Page.has_previous()如果有上一页,返回 True

- Page.has_other_pages()如果有上一面或下一页,返回True

- Page.next_page_number()返回下一页的页码。如果不存在,抛出InvalidPage异常

- Page.previous_page_number() 返回上一页的页码。如果不存在,抛出InvalidPage异常

- Page.start_index() 返回当前页上的第一个对象,相对于分页列表的所有对象的序号

- Page.end_index() 返回当前页上的最后一个对象,相对于分页列表的所有对象的序号

LoginRequiredMixin

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容