知识体系

一、一般流程

Django 一般流程
  1. 用户输入 URL
  2. 基于正则的 URL 分发器会匹配相应的视图
  3. 视图去模型那取数据。
  4. 视图对数据进行处理
  5. 视图把数据传给模板
  6. 模板渲染出网页。

二、基本配置

1. 创建

  • 创建项目:django-admin startproject projectname
  • 创建应用:python manage.py startapp appname

2. 项目目录

projectname
 │  manage.py    // 管理项目
 │  
 ├─appname      // 一个 APP,也是一个包
 │  │  admin.py    // 在后台管理模型
 │  │  apps.py      // 配置 APP
 │  │  models.py  // 模型
 │  │  tests.py
 │  │  views.py    //视图
 │  │  __init__.py
 │  │  
 │  └─migrations    // 与数据库迁移有关
 │          __init__.py
 │          
 └─projectname  // 与项目名相同的 APP
       settings.py    // 整个项目的配置
       urls.py          // 整个项目的路由配置
       wsgi.py
       __init__.py

3. 静态文件

  • 在项目根目录下创建 static 目录。
  • 在 settings.py 下添加 STATICFILES_DIRS。
# settings.py

STATIC_URL = '/static/'   # 默认已添加,使用静态文件时的前缀
STATICFILES_DIRS = [      # 静态文件搜索路径
        os.path.join(BASE_DIR,'static'),  
    ]

# static 模板标签位于 django.contrib.staticfiles 应用下的 staticfiles 模块
# 且 staticfiles 应用已默认注册了
{% load staticfiles %}
<script src="{% static 'app/jquery-1.12.4.js' %}"></script>

4. 模板文件

  • 在项目根目录下创建 templates 目录。
  • 在 settings.py 中添加到 TEMPLATES 中的 DIRS 。

三、路由

  • 每个 URL 都应以 / 结尾。

  • 直接捕获 URL 中的值,用括号括起来,当做位置参数传入视图。
    url(r'^(\d{4}/$)', views.index) 对应的视图函数 index(request, year)

  • 正则分组来匹配 URL,类似默认参数传递给视图(参数名必须和组名相同)。
    url(r'^(?P<year>\d{4}/$)', views.index) 对应的视图函数是 index(request, year)

  • 对某模式 URL 把字典参数传给视图,类似默认参数(参数名必须与键名相同)。
    url(r'^(?P<year>\d{4})/$', views.index, {'foo': 'bar'})对应 index(request, year, foo)

  • 二级路由:在项目路由中添加 path('app/', include('app.urls'))

  • 模板标签url可以解析视图得到 url 模式,并传入值构造出 url。

url(r'^archives/(?P<month>\d{4})/(?P<day>\d+)/$', views.archives, name='archives')

{% for date in date_list %}
<form action="{% url 'app:archives' date.month date.day %}" method="post">
  • 通过调用自身方法构造 URL。
# 模板中:
href="{{ post.make_post_url }}"

# Post 模型中:
def make_post_url(self):
      return reverse('app:post', kwargs={'pk': self.pk}

# app 中的 urls.py
app_name = app
...
url(r'^post/(?P<pk>\d+)/$', views.post, name='post')

四、视图

HTTP 请求中有两个核心对象:HttpRequest、HttpResponse

1. HttpRequest 对象

就是视图函数的第一个参数 request,有许多属性。

# views.py
def index(request):
    fmt = 'path: {}---method: {}---COOKIES: {}'
    return HttpResponse(fmt.format(request.path, request.method, request.COOKIES))

# 页面显示
path: /app/---method: GET---COOKIES: {}
2. HttpResponse 对象

视图函数的返回值必须是一个 HttpResponse 对象。

3. render 函数

该函数返回的就是一个 HttpResponse 对象。
两个位置参数:request,template_name。
一个常用的默认参数:context=None。

五、模型

内容有点多,故另起一文。
详见:https://www.jianshu.com/p/7c514a9c348d

六、模板

1. 模板的执行

从视图中的 context 获取数据,传给模板。

# views.py
from django.shortcuts import render

def index(request):
    context = {'title': 'Hello', 'welcome': 'Django'}
    return render(request, 'index.html', context=context)

# index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
<h1>{{ welcome }}</h1>
</body>
</html>
效果图
2. 模板语言
  • 除了 item 用 {{ }},其他含 Python 关键字的用 {% %} 括起来。
  • 字典数据类型的取值是通过 dict.xxx,而不是 dict[xxx] 。
  • 每个实例都会自动添加 pk 属性,为主键值。
  • 常见模板语言:

{{ item }}

{% if xxx %} {% else %} {% endif %}

{% for item in item_list %} {{ item }} {% empty %}{% endfor %}
  forloop.counter
  forloop.first
  forloop.last

母板:{% block title %}{% endblock %}
子板:{% extends "base.html" %}
   {% block title %}{% endblock %}

帮助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}

{{ name|lower }}

3. 自定义标签

为了在模板语言中做一些复杂操作。有两种:simple_tag、filter 。
simple_tag:任意传递参数,但是不能用作布尔判断。
filter:最多只能传递二个参数,可以用作布尔判断。
具体步骤如下:
a. 在已注册的 app 下创建一个 templatetags 包。具体目录如下:

app/      # app 应用
    __init__.py
    models.py
    templatetags/    # templatetags 包
        __init__.py
        mytag.py    # 自定义标签模块,相应的用法:{% load mytag %}
    views.py

b. 需要有一个叫 register 的全局变量使标签生效。

from django import template

register = template.Library()

c. 注册自定义标签

@register.simple_tag
def myadd(a, b, c):
    return  a + b + c

d. 使用标签,先 load 再使用。

{% load mytag %}
...
{% myadd 3 4 5 %}  # 参数之间用空格隔开,而不是逗号。

e. 如果函数返回的是一个序列,用 as 把值存起来,再 for 循环。

{% recent_post as posts %}
<ul>{% for post in posts %}
    <li>
        <a href="#">{{post.title}}</a>
    </li>{% endfor %}
</ul>

参考文档:
https://www.cnblogs.com/LiCheng-/p/6920900.html
https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/#custom-template-tags-and-filters

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

推荐阅读更多精彩内容