注:最近开始学习Python的Django框架,为了督促学习,强迫自己翻译官方的文档,既是一种学习,也是一种积累!由于经验不足,错误肯定不少,请大家不吝指教!原创内容,转载请注明出处。
Django官方文档
第二部分:新手入门
(之所以从第二部分开始,是因为第一部分是整个官方文档结构图和导引,有空我会翻译出来补全。)
2.1 Django概述
Django诞生于快节奏的新闻编辑室环境,它被设计成快速、简单的通用网站开发工具。
本文档的目的是让你获得足够的基础知识去理解Django是如何工作的,它既是一本教程也可以当做参考资料。当你准备好开始一个项目,你可以从教程开始也可以直接进入更详细的文档。
2.1.1模型设计
你可以在没有数据库的情况下使用Django。
数据模型语法提供多种方式表示你的模型。这里有一个简短的示例:
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
2.1.2安装
可以通过运行Django命令行程序自动地创建数据库表:
$ Python manage.py migrate
2.1.3开放的API
你可以利用大量的开放的Python API访问数据。这些API创建迅速,不需要生成额外的代码。下面是示例:
#从我们创建的"news"应用中导入模块
>>> from news.models import Reporter, Article
# 暂时还没有reporters在系统中
>>> Reporter.objects.all()
[]
#创建一个新的Reporter.
>>> r = Reporter(full_name=‘John Smith‘)
#将对象存入数据库。你必须显式地调用save方法。
>>> r.save()
# 现在它有了ID。
>>> r.id
#新的reporter存在于数据库
>>> Reporter.objects.all()
[<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()
[<Article: Django is cool>]
>>> r = a.reporter
>>> r.full_name
‘John Smith‘
>>> r.article_set.all()
[<Article: Django is cool>]
>>> Article.objects.filter(reporter__full_name__startswith=‘John‘)
[<Article: Django is cool>]
#通过变更对象的属性修改对象,记得调用save方法。
>>> r.full_name = ‘Billy Goat‘
>>> r.save()
# 使用delete()方法删除对象
>>> r.delete()
2.1.4 功能齐全的管理界面
一旦你的模型定义好了,Django会自动地创建一个专业的现成的管理界面。它实际上是一个web页面,让那些被授权的用户可以增加、改变和删除对象。
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)
2.1.5设计你的 URLs
一个干净、优雅的URL方案是高质量WEB应用的重要部分。Django鼓励漂亮的URLs设计,不要把那些令人讨厌的.php或.asp放进URL。
为app设计URLs实际上是创建一个URLconf的Python模块。它是你的app的目录表,它包含一个简单的在URL模式和Python回调函数之间的映射。URLconfs有助于解耦URLs和Python代码。
下面是一个URLconf的例子,它用于上面那个Reporter/Article范例:
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), ]
上面的代码中,通过简单的正则表达式将URLs与具体的Python回调函数(views)联系起来。正则表达式通过括号从URL中获取值。当用户请求一个页面时,Django按顺序遍历每一个匹配模式,并在第一个匹配的的地方停止。(如果没有任何匹配项,Django将返回404页面)。这个过程非常快,因为正则表达式在加载时就会被编译。
一旦成功匹配,Django将导入和调用给定的视图(view),一个简单的Python函数。每一个view传递一个请求对象,它包含了请求的元数据和正则表达式中捕获的值。例如,当用户请求“/articles/2005/05/39323/”这个页面,Django将调用函数news.views.article_detail(request, ’2005’, ’05’, ’39323’)
2.1.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的模板系统,它有许多强大的功能,并力图保持简单易用的特点。
2.1.7设计你的模板
上面的代码加载了news/year_archive.html模板。
Django有一个模板查找路径,它允许你减小模板冗余。在Django设置中,你可以创建模板的目录列表,Django将在列表中按顺序查找模板。
下面是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标题栏的值。圆点不但用于查找属性,也用于字典键值、索引的查找和函数调用。请注意,在{{ article.pub_date|date:"F j, Y" }}中使用了Unix系统风格的管道符号“|”。你可以连接任何个数的管道。你可以编写自定义的模板管道,可以编写自定义的模板标签,运行自定义的后端Python代码。
最后,Django使用“模板继承”的概念,就像{% extends "base.html" %}所做一样。它的意思是先加载名为“base”的模板。这个模板已经预定义了大量的块,并且这些块中还嵌套了块。总之,这帮助让你大量的减少模板的数量,每个模板只专注于它独一无二的部分。
下面是“base.html”的代码。
mysite/templates/base.html {% load staticfiles %} <html> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <img src="{% static "images/sitelogo.png" %}" alt="Logo" /> {% block content %}{% endblock %} </body> </html>
它只是单纯的定义了站点的基本“外观”,并提供子模板填充的“入口”。这让重新设计一个站点变得简单,你只需要更改基础模板这一个文件。
注意,你也可以使用别的模板系统,虽然Django的模板系统和它的模型层整合得很好,但也没有强迫你非用它不可。同样的,你也不是非用Django的数据库API不可。你可以使用别的数据库抽象层,你可以读取XML文件,任何你想要的。Django的每一个部件,例如模型、视图和模板都是松耦合的。
2.2快速安装向导
在使用Django之前,我们必须先安装它。光放有完整的安装向导,包含了所有可能的状况。
2.2.1安装Python
作为一个基于Python的WEB框架,Django需要预先安装Python。你可以从Python的官网或操作系统的软件管理器下载并安装最新版本的Python。另外,想了解哪个版本的Python支持Django,请看文档《What Python version can I use with Django?》。Python内置一个名为SQLite的轻量级数据库,所以你这时还可以不安装数据库程序。如果你使用的是Jython(Python的Java平台实现),你需要一些额外的步骤。
在shell中输入Python,如果显示如下信息,证明已经成功安装Python:
Python 3.4.x
[GCC 4.x] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
2.2.2安装数据库
如果你想工作在“大型”的数据库引擎下,例如PostgreSQL, MySQL, 或者 Oracle,请查看文档《database installation information》
2.2.3移除旧版本的Django
在安装新版本的Django之前,你需要先卸载旧的版本。
2.2.4安装Django
在安装Django时你有三种选择:
•通过操作系统的软件管理工具安装jango,这是最快的方法。
•安装官方发行版。对大多数使用者而言这是最好的选择。
•安装最新的开发版。这适用于那些喜欢使用最新最全的功能,并且不担心代码风险的人。在开发版中,你有可能碰到新的bug,请将它上报,帮助Django的发展。
2.2.5验证
在Python的shell环境中,import Django模块,如下所示:
>>> import django
>>> print(django.get_version())
1.9
待续.........