Django 概览

由于 Django 是在快节奏的新闻编辑室环境中开发的,因此它旨在使常见的 Web 开发任务快速简便。以下是使用 Django 编写数据库驱动 Web 应用的非正式概述。

本文档的目的是向您提供足够的技术细节,以便您了解 Django 的工作原理,但这并非旨在作为教程或参考——但我们两者都有!准备好开始项目时,您可以从教程开始直接深入更详细的文档

设计您的模型

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

数据模型语法提供了许多表示模型的丰富方法——到目前为止,它已经解决了多年来数据库模式方面的问题。这是一个快速示例

news/models.py
from django.db import models


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

安装它

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

$ python manage.py makemigrations
$ python manage.py migrate
...\> py manage.py makemigrations
...\> py manage.py migrate

makemigrations命令查看所有可用的模型,并为任何尚不存在的表创建迁移。migrate运行迁移并在数据库中创建表,还可以选择提供更丰富的模式控制

享受免费的 API

有了它,您就拥有了一个免费且丰富的Python API来访问您的数据。API 是动态生成的,无需代码生成。

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

# 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 可以自动创建一个专业的、可用于生产的管理界面——一个允许经过身份验证的用户添加、更改和删除对象的网站。唯一需要的步骤是将您的模型注册到管理站点。

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)
news/admin.py
from django.contrib import admin

from . import models

admin.site.register(models.Article)

这里的理念是您的网站由员工、客户或仅仅是您自己编辑——您不希望不得不处理仅用于管理内容的后端界面的创建。

创建 Django 应用的一个典型工作流程是尽快创建模型并启动管理站点,以便您的员工(或客户)可以开始填充数据。然后,开发向公众展示数据的方式。

设计您的 URL

简洁优雅的 URL 方案是高质量 Web 应用中的一个重要细节。Django 鼓励漂亮的 URL 设计,并且不会在 URL 中添加任何冗余内容,例如.php.asp

要为应用设计 URL,您可以创建一个名为URLconf的 Python 模块。它是应用的目录,包含 URL 模式和 Python 回调函数之间的映射。URLconf 还用于将 URL 与 Python 代码解耦。

以下是上述Reporter/Article示例的 URLconf 可能的样子

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 回调函数(“视图”)。路径字符串使用参数标签从 URL 中“捕获”值。当用户请求页面时,Django 按顺序遍历每个路径,并在第一个与请求的 URL 匹配的路径处停止。(如果没有一个匹配,Django 会调用一个特殊的 404 视图。)这非常快,因为路径在加载时被编译成正则表达式。

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

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

编写您的视图

每个视图负责执行以下两件事之一:返回包含请求页面内容的HttpResponse对象,或引发异常,例如Http404。其余的取决于您。

通常,视图会根据参数检索数据,加载模板并使用检索到的数据呈现模板。以下是上述year_archive的示例视图

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模板。它可能如下所示

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 的“管道”(“|”字符)。这称为模板过滤器,它是一种过滤变量值的方法。在这种情况下,日期过滤器会以给定的格式(如 PHP 的 date 函数中所述)格式化 Python datetime 对象。

您可以链接任意数量的过滤器。您可以编写自定义模板过滤器。您可以编写自定义模板标签,它们在幕后运行自定义 Python 代码。

最后,Django 使用“模板继承”的概念。这就是{% extends "base.html" %}的作用。这意味着“首先加载名为‘base’的模板,该模板定义了一组块,并用以下块填充这些块。”简而言之,这可以让您显著减少模板中的冗余:每个模板只需要定义该模板特有的内容。

以下是“base.html”模板可能的样子,包括使用静态文件

templates/base.html
{% load static %}
<html lang="en">
<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 或其他后端集成的缓存框架

  • 允许您通过编写一个小 Python 类来创建 RSS 和 Atom 提要的联合框架

  • 更具吸引力的自动生成的管理功能——本概述仅触及了表面。

接下来,请您下载Django,阅读教程,并加入社区。感谢您的关注!

返回顶部