Django概览

因为Django是在一个快节奏新闻工作环境中被开发出来的,所以它设计成一个能快速简易完成大部分网页共通的功能的框架。接下来的一些信息将会带你用Django制作一个基于数据库的网页应用。
这个文档的目的是给你看部分Django技术上的细节来帮助你理解Django是如何工作的,这并不是一个教程,也不是技术参考文档。当你准备好开始制作一个项目的时候,你可以选择教程(start with the tutorial)或者参考更多细节文档(dive right into more detailed documentation)。

设计你的模型(models)

尽管你没有数据库,你一样可以愉悦的使用Django,Django拥有一个关系映射器(object-relational mapper),你可以通过Python代码来描述你的数据库。
数据模型语法(data-model syntax)提供了丰富的用来表示你的模型的方法,它已经被用于解决数据库构架问题很多年了。如下是一个简单的例子:
mysite/news/models.py
from django.db import modelsclass Reporter(models.Model):full_name = models.CharField(max_length=70)def __str__(self):return self.full_nameclass Article(models.Model):pub_date = models.DateField()headline = models.CharField(max_length=200)content = models.TextField()reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)def __str__(self):return self.headline




安装它


接下来,启用Django命令行来自动创建数据库表格

$ python manage.py migrate

migrate命令将会查看你都所有可用的模型,并在数据库中为那些没有表格的模型创建表格,同时提供你更丰富的模型控制(much
richer schema control)。



享受这些不受约束的API


有了这个,你就拥有了不受约束的、丰富的DjangoPython API来访问你都数据库。API是即时创建的,不需要代码生成:

#导入我们给“nwes”APP创建的模型
>>> from news.models import Reporter, Article
#这时,系统中还没有“记者”
>>> Reporter.objects.all()
<QuerySet []>

#创建一个新的“记者”
>>> r = Reporter(full_name='John Smith')
#要想将对象存入数据库中,你必须明确调用'save()'
>>> r.save()
#给他一个ID
>>> r.id
1
#现在,这个新的“记者”已经在你的数据库中了
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>
#名字字段在Python对象中表示为一个属性
>>> r.full_name
'John Smith'
#Django提供了丰富的数据库查看接口
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__startswith='John')
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains='mith')
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):...
DoesNotExist: Reporter matching query does not exist.

#新建一篇“文章”
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()
#现在“文章”已经存入数据库了
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]
#“文章”对象可以通过接口查看“记者”对象
>>> r = a.reporter
>>> r.full_name
'John Smith'
#反过来同样,可以通过“记者”对象查看“文章对象”
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]
#API接口可以根据需要按照关系高效率地执行#JOINs for you behind the scens(这句实在不会翻译了。。。)#如下将会返回所有以“John”为名字开头的对象的文章
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>
#通过改变属性来更改对象,同时调用save()来保存
>>> r.full_name = 'Billy Goat'
>>> r.save()
#通过调用delete()来删除一个对象
>>> r.delete()


动态管理界面:这不仅仅是一个框架,这是整座屋子


一旦你定义了你的模型,Django就会自动创建一个专业的几乎成形的管理界面(administrative interface)——一个可以让经过认证的用户添加、更改、删除对象的网站。这与在管理站点注册模型一样简单。



mysite/news/models.py
from django.db import modelsclass Article(models.Model):pub_date = models.DateField()headline = models.CharField(max_length=200)content = models.TextField()reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

mysite/news/admin.py
from django.contrib import adminfrom . import modelsadmin.site.register(models.Article)

这玩意儿存在的意义就是当你的网站是给你的员工、客户,或者你自己编辑的时候,你又不想浪费时间去再为管理后台目录内容创建一个界面。
开发Django apps的一个经典套路就是你设计好模型并以最快的速度启动管理站点,然后你就可以交给员工(或是客户)来上传数据。然后将开发数据的方法设计为public(编者暂时无法理解最后一句话,暂时理解为尽快将数据操作接口做出来)

设计网址(URL)

在高质量的网页应用开发中,一个优雅的URL组合是非常重要的细节。Django鼓励设计好看的URL,不要把那些什么.php、.asp讨厌的字符加到URL里边!=3=
要为应用设计URL,你需要创建一个Python模型叫做URLconf。这是应用内容的表格,它包含了URL模式和Python回掉函数之间的简单映射。URLconf也用于从Python代码中分离URL。
如下是一个为Reporter/Article例子创建的URLconf模型:
mysite/news/urls.py
from django.urls import pathfrom . import viewsurlpatterns = [path('articles/<int:year>/', views.year_archive),path('articles/<int:year>/<int:month>/', views.month_archive),path('articles/<int:year>/<int:month>/<int:pk>/', views.article_detail),
]

上面的代码将URL路径设置到Python回到函数("views")。路径字符串用参数值标签来获取URL中的值。当一个用户请求一个页面时,Django一次遍历每个路径,并在第一个匹配URL的地方停下。(如果没有匹配的URL,Django将会调用404视图=。=)路径加载时会被编译成正则表达式,所以这个过程就跟开火箭似的。

一旦找到一个匹配的URL,Django将会调用指定的视图,一个Python函数。每个视图都会传递一个包含请求元数据以及模式中获取的值的请求对象。
举个例子:如果我们请求URL"/articles/2005/05/39323/",Django会调用函数Django news.views.article_detail(request, year = 2005, month = 5,pk = 39323)

编写你的视图(views)

每个视图都要执行如下两项操作中的一项:返回包含请求页面内容的HttpResponse对象;或者引发异常(如Http404),其余的由你决定。
按照国际惯例,视图会根据参数检索数据,加载检索来的数据来呈现模板(template)。下边是一个Djangoyear_archive示例:
mysite/news/views.py
from django.shortcuts import renderfrom .models import Articledef year_archive(request, year):a_list = Article.objects.filter(pub_date__year=year)context = {'year': year, 'article_list': a_list}return render(request, 'news/year_archive.html', context)

这个示例用到了Django的模板系统(template system),这个系统有多个强大的功能,同时它也在努力做到让不是码农的人也能用他。

设计你的模板(templates)

上边的代码加载了 news/year_archive.html 模板。
Django拥有一个模板搜索路径,可以让模板间的冗余最小化。在Django的设置(settings)中,你可以指定一个目录列表通过DIRS来检查模板。如果第一个目录中没有要检索的模板,就会转到第二个目录,以此类推。
假设已经找到news/year_archive.html模板。如下是模板的样式:
mysite/news/templates/news/year_archive.html
{% extends "base.html" %}{% block title %}Articles for {{ year }}{% endblock %}{% block content %}
<h1>Articles for {{ year }}</h1>{% for article in article_list %}<p>{{ article.headline }}</p><p>By {{ article.reporter.full_name }}</p><p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}

双花括号中的是变量。{{ article.headline }}意思是“输出文章标题属性的值”。但点不仅用于属性查找,也可以用作字典键查找,索引查找和函数调用。
注意{{ article.pub_date|date:"F j, Y" }} 用了Unix风格的“通道”(“|”字符)。这叫模板过滤器,它可以用来过滤变量值。在这个示例中,日期过滤器以给定的格式来格式化Python日期时间对象(如同PHP的日期函数)。
你可以链接无数个过滤器。你可以编写自定义模板过滤器(custom template filters)。你可以自己编写在后台运行Python代码的自定义模板标签(custom template tags)。
最后,Django使用了“集成模板”这一概念。即{% extends"base.html" %},意思是“先加载名为‘base’的模板,它已经定义了一堆块,用下面的块来填充块。”简单来说,这可以大大减少模板中的冗余:每个模板只需要定义这个模板与其他模板都不一样的、唯一的内容。
以下是包含了静态文件(static files)的“base.html”模板:
mysite/templates/base.html
{% load static %}
<html>
<head><title>{% block title %}{% endblock %}</title>
</head>
<body><img src="{% static "images/sitelogo.png" %}" alt="Logo" />{% block content %}{% endblock %}
</body>
</html>

简单来说,这个模板定义了网址的外观(带有站点标识),并且为子模版的填充提供了“洞”(或者是是路径)。这让设计新网站变得十分简单,你甚至只需要更改一个文件--基础模板。
你也可以重复利用相同的子模版,基于不同的基础模板来打造多种多样版本的网站。Django的创造者用这种技术搞了很多不同移动版的网站,而他仅仅创建了一个新的基础模板。
不过讲道理,如果你喜欢其他的系统,你也不是非要用Django的模板系统=3=。尽管Django的模板系统和Django的模型层结合的非常好,但是没人逼你用=3=。同样的,你也不是非要用Django的数据库接口,你可以用其他的数据库抽象层,你可以从磁盘读取文件,你可以读取XML文件,你可以做很多你想做的事情( ̄▽ ̄* )ゞ。每一个Django模型、视图、模板都与下一个耦合。

这些只是冰山一角

这仅仅是Django功能的简短概览。如下有一些很有用的功能:
  • 与mecached或其他后端集成的缓存框架(caching framework)。
  • 一个让创建RSS、Atom和编写Python类一样简单的联合框架(syndication framework)
  • 更生动的自动生成管理功能,上边这个概述只是提到了一些表面功能。

接下来,你可以去下载Django,阅读教程(the tutorial),或者加入社区。

感谢你的支持!

Django2.0官方文档--概览相关推荐

  1. Hyperledger Fabric 2.0 官方文档中文版 第6章 教程(上)

    Hyperledger Fabric 2.0 官方文档中文版第6章 教程上 总目录 6.教程(上) 将智能合约部署到通道 启动网络 Logspout设置 打包智能合约 安装链码包 批准链码定义 将链码 ...

  2. SWFObject 2.0官方文档

    SWFObject 2.0官方文档 2008年4月24日 翻译:farthinker 主要内容: 1 . 什么是SWFObject 2.0? 2 . 为什么你应该使用SWFObject 2.0? 3 ...

  3. Hyperledger Fabric 2.0 官方文档中文版 第6章 教程(下)

    Hyperledger Fabric 2.0 官方文档中文版 第6章 教程下 总目录 6.教程(下) 使用CouchDB 为什么使用CouchDB? 在Hyperledger Fabric中启用Cou ...

  4. Hyperledger Fabric 2.0 官方文档中文版 第3章 关键概念

    Hyperledger Fabric 2.0 官方文档中文版 第3章 关键概念 总目录 3.关键概念 引言 什么是区块链? 区块链为什么有用? 什么是Hyperledger Fabric? Hyper ...

  5. Hyperledger Fabric 2.0 官方文档中文版 第5章 开发应用程序

    Hyperledger Fabric 2.0 官方文档中文版 第5章 开发应用程序 总目录 5.开发应用程序 情景 PaperNet网络 介绍参与者 分析 商业票据生命周期 交易 账本 过程和数据设计 ...

  6. CUDA10.0官方文档的翻译与学习之编程接口

    目录 背景 用nvcc编译 编译工作流 二进制适配性 ptx适配性 应用适配性 C/C++适配性 64位适配性 cuda c运行时 初始化 设备内存 共享内存 页锁主机内存 可移植内存 写合并内存 映 ...

  7. Hyperledger Fabric 2.0 官方文档中文版 第1章 引言

    Hyperledger Fabric 2.0 官方文档中文版 第1章 引言 总目录 1.引言 Hyperledger Fabric 模块化 许可区块链与无许可区块链 智能合约 新途径 隐私和保密 可插 ...

  8. Spring Boot 2.0官方文档之 Actuator

    https://blog.csdn.net/alinyua/article/details/80009435 前言:本文翻译自Spring Boot 2.0.1.RELEASE官方文档,该Spring ...

  9. vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍

    这是我的vue.js 2.0的学习笔记,采取了将官方文档中的代码集中到一个文件的形式.目的是保存下来,方便自己查阅. !官方文档:https://cn.vuejs.org/v2/guide/ 01. ...

最新文章

  1. python的沙盒环境virtualenv(二)--简单使用
  2. SuperMap iDesktop Cross 8C 开源桌面GIS下载与扩展开发
  3. 用户计算机通过连入局域网上网时,重庆市职称计算机考试理论题库05
  4. 每天学习python 30分钟 -了解python - 看懂#!/usr/bin/python
  5. 牛客 - Pass Through With One Breath(中位数)
  6. php中文删除乱码部分,PHP中文乱码解决办法
  7. oracle数据库中的一些操作
  8. Android趣味课程:九宫格拼图游戏
  9. Nodejs 中文分词
  10. ice php 5.6.32,PHP通过ice调用python程序
  11. package crypto/rand: unrecognized import path crypto/rand (import path does not begin with hostnam
  12. php如何采集,php采集入门教程,教你如何写采集
  13. 0基础学绘画怎么临摹
  14. 抓包工具有哪些你知道吗?今天给你们介绍四款最受欢迎的抓包神器
  15. 提高网吧上座率,TG-NET网吧光纤万兆方案
  16. nrf52在未配对的情况下使用白名单广播,指定安卓手机允许连接
  17. JS实现字符串模糊匹配
  18. c语言stdoux串口流,嵌入式C语言代码优化的一些经验
  19. 厦门大学的【软件工程专业】被撤销!
  20. LeetCode 1278. 分割回文串 III

热门文章

  1. 苹果iOS被曝安全漏洞:一条短信可让手机死机
  2. 银河麒麟/Ubuntu安装cuda和显卡驱动、cuDNN
  3. 推荐通用图模型工具包pymc
  4. python基础教程:教你如何自学python入门到精通
  5. python 3爬取 全国高校对四川历年招生数据(文理省控线,文理专业线)存入Excel表(重构)
  6. 小猪o2o源码v14.17双系统版(生活通+营销系统)怎么配置微信支付和支付宝支付
  7. HTML禁止复制粘贴以及禁止下载图片的小技巧
  8. 【word】空白页空白行删除不了,按delete
  9. Spring整合FreeMarker本地化动态设置
  10. “指定的网络名不再可用的”新解决案例