[译]Django Documentation 中文翻译——第二章(第一节)

541 阅读6分钟

开始!!

Django 新手?网络开发新手?好吧,你来对地方了,阅读下面的材料去快速启动并运行。

1.1 初识 Django

由于 Django是在一种块节奏的新闻办公室似的的环境下开发的,所以它本身是设计的目的就是快速容易去开发网站任务。这里是一个非正式的总概览,描述了如何使用 Django 去写一个数据库驱动的网站 APP。 这篇文章的目标是通过提供足够的技术专业去帮你足解 Django 的运行原理,但它并只不具有指导性或者参考性——因为它都有(皮一下很开心)

2.1.1 设计你的模型

即便你不使用数据库,他仍然具有对象关系映射(ORM)功能,在这里,你可以通过 Python 代码去设置数据库。 'data-model'代码为展现你的模型提供了丰富的方法——到目前为止,它已经解决了多种数据库模式的问题。

如:mysite/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

2.1.2 安装

接下来,运行的Django命令行(command-line) 去自动创建数据库表

python manage.py makemigrations
python manage.py migrate
  • makemigrations 命令行寻找所有可用模型然后创建不存在的表。
  • migrate 运行运行makemigrations并在数据库中创建数据表

2.1.3 使用 API

有了上述表以后,你就拥有了一个免费但内容丰富的 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()

2.1.4 动态的 admin 界面:不仅仅是脚手架——而是整个房子

一旦你定义了你的模型(model,此处指数据库),Django 就会自动创建一个专业的产物 —— administrative interface,一个可以让授权用户进行增删改操作的网站。我们唯一需要操作的步骤就是在这个 admin 点注册模型:

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

admin.site.register(models.Article)

在创建 Django 项目过程中,一个典型的流程就是县创建一个 models,将 admin 设置成功后迅速运行,这样其他人员就可以开始获取数据。然后在开发面向用户的方式。

2.1.5 设置 urls

一个干净的、优雅的 URL组合是构建一个高质量网站应用的重要细节。Django 鼓励设计漂亮的 URL,且不会像其他语言(php,asp)那样添加任何冗余的东西。

如要为app 设计URL,你需要创建一个 Python 模型,名称为URLconf,后者是你app的表目录(A table of contents),包含 URL 和 Python 回调函数(Python callback functions)的映射关系,同时 URLconfs 也可以将 URLs 从 Python 代码中解耦出来。 示例:

#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 路径到了”view" 中的回调函数上。路径字符串通过参数标记去”捕获“URLs 的值。当用户对一个网页发起请求,Django会依次运行每一个路径,直到找到第一个符合要求的 URL 才会停止(如果没有找到符合的 URL,Django 会调出404 视图)。由于路径在加载期间,这些路径就会被编译(be compiled into)成正则表达式(regular expressions)。 一旦有一个URL 路径匹配,Django 就会调用这个视图函数。每一个视图函数都会通过一个 request 对象(包含 request 元数据metadata)和该路径所得到的数据 例如:如果一个用户发其 url 请求“/articles/2005/05/39323/”,Django 就会调用函数news.views.article_detail(request,year=2005,month=5,pk = 39239

2.1.6 写下你的视图

每一个视图都可以执行以下任务:返回一个 包含请求页面内容的HTTPResponse 对象,或者返回一个 HTTP404 结果。之后怎么执行就要看你的了。 一般来说,视图函数首先通过参数检索数据,然后加载模板,最后用检索后的数据去渲染模板。例如:

#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 的 tampalte体系,这个体系功能请打,但是非程序员来说也对非常简单。

2.1.7 设计你的模板

下面的代码加载了news/year_archive.html模板。 Django 具有一个模板查询路径,这个路径可以让你在大量模板中减少查询冗余。在你的 Django 设置中,你可以指定一个列表目录(a list of directories)(此处目录指的是文件夹)去查询目录中的模板,如果第一个目录中没有,就去查询第二个,知道查询结束

{% 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式的管道符(|),称为模板过滤,是一种过滤变量值的方式。在本例中,在给定的格式中,日期过滤出了使用 Python datetime 对象。 可以根据你的喜好连接多个过滤条件。同时也可以自定义模板过滤器,你可以编写自定义模板标签,这些标签可以运行自定义 Python 代码。 最后,Django 也支持”模板继承“。{% extends "base.html" %}就是模板继承,意思为:首先继承一个叫”base“的模板,base 模板时遗传的代码,然后用后面的代码补全 base 代码。简而言之,它可以大幅度的减少模板的冗余:每个模板的必须定义其唯一之处。 ”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>

简单来说,模板定义了站点的外观和感受(look-and-feel),包括站点的 logo 在内,同时模板也为子模板提供了可以继承的‘洞’。这样,一个站点的重新设计可以仅仅通过修改简单的文件——模板文件——即可。 注意:如果你有更倾向的系统,不必非要使用 Django 的模板系统。虽然 Django 模板系统可以完美适配 Django 的模型层,但没有什么力量可以强迫你使用这些模板。同时,你不需要必须使用 Django 的数据库 API。你可以使用另一而终数据库抽象层,你可以阅读 XML 文件,可以将这些文件从磁盘上删除,或者怎么处理都可以。Django 的每一层——模型层、视图层,模板层都是彼此解耦的

2.1.8这只是表面