Skip to main content

Django一目了然

因为Django是在一个快节奏的新闻编辑室环境中开发的,所以它被设计为使常见的Web开发任务快速和容易。下面是如何用Django编写一个数据库驱动的Web应用程序的非正式概述。

本文档的目标是给你足够的技术细节,以了解Django的工作原理,但这不是一个教程或参考 - 但我们有两个!当你准备好开始一个项目,你可以 从教程开始潜入到更详细的文档

设计您的模型

虽然你可以使用没有数据库的Django,它附带一个 object-relational mapper,在其中你用Python代码描述你的数据库布局。

数据模型语法 提供了许多丰富的方式来表示你的模型 - 到目前为止,它已经解决了多年的数据库模式问题。下面是一个简单的例子:

mysite/news/models.py
from django.db import models

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

    def __str__(self):              # __unicode__ on Python 2
        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):              # __unicode__ on Python 2
        return self.headline

安装它

接下来,运行Django命令行实用程序以自动创建数据库表:

$ python manage.py migrate

migrate 命令查看所有可用的模型,并在数据库中为任何不存在的表创建表,以及可选地提供 更丰富的模式控制

享受免费的API

有了,你有一个免费的,丰富的,Python API 访问您的数据。 API是即时创建的,不需要代码生成:

# Import the models we created from our "news" app
>>> from news.models import Reporter, Article

# No reporters are in the system yet.
>>> Reporter.objects.all()
<QuerySet []>

# Create a new Reporter.
>>> r = Reporter(full_name='John Smith')

# Save the object into the database. You have to call save() explicitly.
>>> r.save()

# Now it has an ID.
>>> r.id
1

# Now the new reporter is in the database.
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>

# Fields are represented as attributes on the Python object.
>>> r.full_name
'John Smith'

# Django provides a rich database lookup 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.

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

# Now the article is in the database.
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>

# Article objects get API access to related Reporter objects.
>>> r = a.reporter
>>> r.full_name
'John Smith'

# And vice versa: Reporter objects get API access to Article objects.
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>

# The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>

# Change an object by altering its attributes and calling save().
>>> r.full_name = 'Billy Goat'
>>> r.save()

# Delete an object with delete().
>>> r.delete()

动态管理界面:它不只是脚手架 - 它是整个房子

一旦你的模型被定义,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应用程序的一个典型工作流程是创建模型,并尽可能快地运行管理站点,以便您的员工(或客户端)可以开始填充数据。然后,开发数据呈现给公众的方式。

设计您的网址

一个干净,优雅的URL方案是高质量Web应用程序中的一个重要细节。 Django鼓励美丽的网址设计,不会在网址,如 .php.asp 的任何瑕疵。

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

下面是上面的 Reporter/Article 示例的URLconf:

mysite/news/urls.py
from django.conf.urls import url

from . import views

urlpatterns = [
    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),
]

上面的代码将URL作为简单的 正则表达式 映射到Python回调函数(“views”)的位置。正则表达式使用括号来从URL中“捕获”值。当用户请求页面时,Django按顺序运行每个模式,并停止在与请求的URL匹配的第一个模式。 (如果没有匹配,Django调用一个特例404视图)。这是非常快的,因为正则表达式是在加载时编译的。

一旦一个正则表达式匹配,Django导入并调用给定的视图,这是一个简单的Python函数。每个视图都会传递一个请求对象(包含请求元数据)和正则表达式中捕获的值。

例如,如果用户请求URL“/articles/2005/05/39323/”,Django将调用函数 news.views.article_detail(request, '2005', '05', '39323')

写你的意见

每个视图负责执行以下两项操作之一:返回包含所请求页面的内容的 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的 模板系统,它有几个强大的功能,但努力保持简单足够非程序员使用。

设计模板

上面的代码加载 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风格的“pipe”(“|”字符)。这被称为模板过滤器,它是一种过滤变量值的方法。在这种情况下,日期过滤器以给定格式(如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>

简单来说,它定义了网站的外观(使用网站的标志),并为子模板填充提供了“洞”。这使得网站重新设计与更改单个文件(基本模板)一样简单。

它还允许您创建多个版本的站点,使用不同的基本模板,同时重用子模板。 Django的创作者使用这种技术来创建惊人的不同移动版本的网站 - 只需创建一个新的基本模板。

注意,如果你喜欢另一个系统,你不必使用Django的模板系统。虽然Django的模板系统与Django的模型层特别好集成,但没有什么强迫你使用它。对于这一点,你不必使用Django的数据库API。你可以使用另一个数据库抽象层,你可以读取XML文件,你可以从磁盘读取文件,或任何你想要的。每一个Django - 模型,视图,模板 - 与下一个解耦。

这只是表面

这只是对Django的功能的一个快速概述。一些更有用的功能:

  • 与memcached或其他后端集成的 缓存框架

  • 一个 联合框架 使得创建RSS和Atom订阅源比编写一个小的Python类容易。

  • 更性感的自动生成的管理功能 - 这个概述几乎没有刮伤表面。

下一个明显的步骤是为您 download Django,阅读 教程 和加入 the community。感谢您的关注!