Django 概览

Django 是设计是为了使通用的Web开发任务变得快速而又简单, 一下是如何使用Django编写数据库驱动的Web应用程序的非正式概述.

这个文档的目标是给你足够的技术细节来理解Django是如何工作的,但是这不是一个教程或是参考. 当你准备开始一个项目是, 你可以从教程开始.(教程还没有开始.)

1. 设计你的模型

虽然你可以在没有数据库的情况下使用Django,但是它带有一个 ++对象关系映射器++ ,在这个 ++映射器++ 中你可以用Python代码描述你的数据库布局

到目前,该 ++数据库模型语法++ 可以提供多种丰富的方式代表你的数据库模型.它已经解决了存在多年的数据库架构问题,这里有一个简单的例子:

mysite/news/models.py


class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):
        return self.full_name

class 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

2. 安装模型

接下来, 使用Django的命令行工具自动创建数据库表:

$ python manage.py migrate

migrate 命令将读取所有可用的模型,并且帮你创建数据库中不存在的表,你还可以选择使用 ++更丰富的控制模式++ .

3. Python API

并且Django提供了丰富的Python API来访问你的数据.API是即使创建的,不需要代码生成:

# 导入我们创建的 app 中的模型.
>>> from news.models import Reporter, Article

# 目前数据库中还没有数据.
>>> Reporter.objects.all()
<QuerySet []>

# 创建一个新的 Reporter.
>>> r = Reporter(full_name='John Smith')

# 调用 save() 方法,将对象保存到数据库中
>>> r.save()

# 现在它有了一个 id.
>>> r.id
1

# 现在新的 Reporter 已经保存到数据库里了.
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>

# 数据库的字段在 Python 里表示为属性.
>>> r.full_name
'John Smith'

# Django提供了许多数据库查询的 API.
>>> 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.

# 创建一个 article.
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()

# 现在 article 已经保存到数据库了.
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>

# Article 对象获得对相关 Reporter 对象的API访问.
>>> r = a.reporter
>>> r.full_name
'John Smith'

# 反过来也是: Reporter 对象获得对相关 Article 对象API访问.
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>

# 该API遵循您所需要的关系,执行更高效.
# 查询一个记者的所有文章,他的名字以“约翰”开头.
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>

# 通过改变对象的属性和调用 save() 来更改对象。
>>> r.full_name = 'Billy Goat'
>>> r.save()

# 使用 delete() 删除一个对象.
>>> r.delete()

4. 动态管理界面

当你定义了模型之后,Django可以自动创建一个专业的、生产就绪的管理界面—— 一个允许管理员用户 添加、更改和删除对象的管理网站。这就像在管理网站注册你的模型一样简单:

mysite/news/models.py

from django.db import models

class 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 admin
from . import models

admin.site.register(models.Article)

你的网站可能是由工作人员,客户或者其他人编辑内容.Django的管理站点可以便于其他人填充数据.

5. 设计你的URL

一个干净优雅的URL方案是高质量Web应用程序中的一个重要细节。Django鼓励美丽的URL设计,并不会在URL中放置任何东西,比如.php或.asp。

要为应用程序设计URL,您需要创建一个名为URLconf的Python模块。您的应用程序的内容列表,它包含URL模式和Python回调函数之间的简单映射。URLconf也用于从Python代码中分离URL。

下面是 上面的Reporter/Article 例子的URLconf参考:

mysite/news/urls.py

from django.urls import path

from . import views

urlpatterns = [
    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的路径上停止。(如果没有匹配的,Django调用一个特殊的404视图。)这非常快,因为在加载时将路径编译成正则表达式。

一旦一个URL模式匹配,Django调用给定的视图,它是一个Python函数。每个视图都会传递一个请求对象,其中包含 metadata ,以及 urlpattrens 中捕获的值。

例如,如果用户请求URL“/ articles/2005/05/39323 /”,Django将调用该函数

news.views.article_detail(request, year=2005, month=5, pk=39323)

6. 编写视图

每个视图负责执行以下两项操作之一:返回HttpResponse包含所请求页面的内容的对象,或引发异常,如Http404。其余的由你决定。

通常,视图根据参数检索数据,加载模板并使用检索的数据呈现模板。year_archive以上是来自上方的示例视图 :

mysite/news/views.py

from django.shortcuts import render

from .models import Article

def 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的模板系统,它有几个强大的功能,并且努力保持着足够的简单以供非程序员使用。

7. 设计你的模板

上面的代码加载 news/year_archive.html 模板。

Django有一个模板搜索路径,它允许你最小化模板间的冗余。在您的Django设置中,您可以指定一个目录列表来检查模板 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风格的“管道符”(“|”字符)。这称为模板过滤器,它是一种过滤变量值的方法。在本例中,date过滤器以给定的格式(如PHP的date函数中所示)格式化为 Python 的 datetime 对象。

你可以把你想要的过滤器链在一起。你可以编写自定义模板过滤器。你可以编写自定义模板标签,在后台运行定制的Python代码。

最后,Django使用了“模板继承”的概念。这就是 {% extends "base.html" %} 。它的意思是“首先加载一个名为base的模板,它定义了一块,然后用下面的块填充这些块。简而言之,这可以大大减少模板中的冗余:每个模板只能定义模板特有的内容。

就是“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>

简单地说,它定义了站点的外观(带有站点的logo),并为子模板提供了“holes”来填充。这使得网站重新设计就像修改一个文件一样简单——基本模板。

它还允许您创建多个版本的站点,使用不同的基本模板,同时重用子模板。Django的创建者使用这种技术创建了截然不同的移动版本的站点,只需创建一个新的基本模板即可。

请注意,如果您更喜欢另一个系统,则不必使用Django的模板系统。Django的模板系统与Django的模型层很好地结合在一起,但是没有任何东西强迫您使用它。对于这个问题,您也不必使用Django的数据库API。您可以使用另一个数据库抽象层,您可以读取XML文件,您可以读取磁盘上的文件,或者您想要的任何东西。每个Django模型、视图、模板都是从下一个分离出来的。

8. 这只是表面

这只是Django功能的简要概述。一些更有用的功能:

  • 与memcached或其他后端集成的缓存框架。
  • 一个联合框架,使得创建RSS和Atom提要和编写一个小的Python类一样简单。
  • 更性感的自动生成的管理功能——这个概述仅仅触及了表面。

下一个明显的步骤是让你下载Django,阅读教程并加入社区。感谢您的关注!

9. 额, 说点没用的

我是按照官方文档的格式进行翻译,所以格式根官方格式一致

如果大家发现哪些地方有问题可以联系我

2426525089@qq.com

或者加入QQ群跟我一起翻译,群号码: 223673646

现在不是我一个人了#尴尬

@入沐三分

Django2文档-入门概览的更多相关文章

  1. NET中的规范标准注释(二) -- 创建帮助文档入门篇

    一.摘要 在本系列的第一篇文章介绍了.NET中XML注释的用途, 本篇文章将讲解如何使用XML注释生成与MSDN一样的帮助文件.主要介绍NDoc的继承者:SandCastle. 二.背景 要生成帮助文 ...

  2. Quartz.NET文档 入门教程

    概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...

  3. 使用.NET中的XML注释(二) -- 创建帮助文档入门篇

    一.摘要 在本系列的第一篇文章介绍了.NET中XML注释的用途, 本篇文章将讲解如何使用XML注释生成与MSDN一样的帮助文件.主要介绍NDoc的继承者:SandCastle. 二.背景 要生成帮助文 ...

  4. Gulp文档入门的文档

    Gulp自动化执行文件的操作 首先gulp基于node开发的,先按照node.js,使用npm sudo npm install -g gulp (在全局的范围安装 gulp) gulp --help ...

  5. C# 自动生成代码API文档

    暂时没学会正规的转载style临时记录一下 NET中的规范标准注释(一) -- XML注释标签讲解 http://www.cnblogs.com/mq0036/p/3544264.html NET中的 ...

  6. [转]unity3d 脚本参考-技术文档

    unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...

  7. Spring 官方教程:使用 Restdocs 创建 API 文档

    https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247483998&idx=1&sn=6ae5fa795d36b1 ...

  8. 如何写Java文档注释(Java Doc Comments)

    本文翻译自How to Write Doc Comments for the Javadoc Tool,但是精简了一些私以为不重要的东西 本文不讨论如何使用javadoc工具自动生成文档的方法,而是主 ...

  9. KOTLIN开发语言文档(官方文档) -- 入门

    网页链接:https://kotlinlang.org/docs/reference/basic-syntax.html 1.   入门 1.1.  基本语法 1.1.1.   定义包 包说明应该在源 ...

随机推荐

  1. 在使用ajax实现三级联动调用数据库数据并通过调出的数据进行二级表单查询

    在使用ajax实现三级联动查询数据库数据后再使用ajax无刷新方式使用三级联动调出的数据进行二级查询 但是现在遇到问题,在二级查询的时候期望是将数据以表格的形式展示在三级联动的下方,但是现在在查询后会 ...

  2. dingo/API 最新版 V2.0 之安装讲解

    我发现关于dingo/API V2.0的资料少之又少,应该也是发布时间不久的原因.下面,我就来给大家讲解(翻译)下官方的英文文档,如果有说的不对的地方,请指正.先附上,官网wiki地址https:// ...

  3. Servlet&JSP-HTTP报文头获取及应用

    完整代码请参考:https://github.com/devway9/java-exercise/tree/master/servlet-jsp 目录 1 HttpServletRequest获取报文 ...

  4. nginx+tomcat安装配置

    nginx+tomcat安装配置 # nginx+tomcat安装配置 #创建网站目录 mkdir -p /www/wwwroot cd /www #安装配置 wget http://mirrors. ...

  5. 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

  6. SolrJ 复杂查询 高亮显示

    SolrJ 复杂查询 高亮显示 上一章搭建了Solr服务器和导入了商品数据,本章通过SolrJ去学习Solr在企业中的运用.笔者最先是通过公司的云客服系统接触的Solr,几百万的留言秒秒钟就查询并高亮 ...

  7. 51Nod--1018排序

    1018 排序 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出N个整数,对着N个整数进行排序 Input 第1行:整数的数量N(1 <= N  ...

  8. 实战-Mysql主从复制

    前言: Mysql内建的复制功能是构建大型高性能应用程序的基础.由于目前mysql的高可用性架构MMM和MHA均建立在复制的基础之上,本文就mysql主从复制进行实战描述,希望对读者提供帮助.之前 服 ...

  9. spring boot + mybatis + hikaricp + swagger2 + jasypt

    好久没写博客了记录下写过的东西,别到时候又忘了 文章前提:前面开发项目的时候数据池一直用的阿里的druid,这个数据池吧也不能说它不好,为什么现在想改成hikaricp数据池呢,完全是实用项目需要.d ...

  10. hdu5418--Victor and World(floyd+状压dp)

    题目链接:点击打开链接 题目大意:有n个城市.在n个城市之间有m条双向路.每条路有一个距离.如今问从1号城市去游览其他的2到n号城市最后回到1号城市的最短路径(保证1能够直接或间接到达2到n).(n& ...