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. 额, 说点没用的
我是按照官方文档的格式进行翻译,所以格式根官方格式一致
如果大家发现哪些地方有问题可以联系我
或者加入QQ群跟我一起翻译,群号码: 223673646
现在不是我一个人了#尴尬
@入沐三分