Django2.0官方文档--概览

Django概览

因为Django是在一个快节奏新闻工作环境中被开发出来的,所以它设计成一个能快速简易完成大部分网页共通的功能的框架。接下来的一些信息将会带你用Django制作一个基于数据库的网页应用。
这个文档的目的是给你看部分Django技术上的细节来帮助你理解Django是如何工作的,这并不是一个教程,也不是技术参考文档。当你准备好开始制作一个项目的时候,你可以选择教程(start with the tutorial)或者参考更多细节文档(dive right into more detailed documentation)

设计你的模型(models)

尽管你没有数据库,你一样可以愉悦的使用DjangoDjango拥有一个关系映射器(object-relational mapper),你可以通过Python代码来描述你的数据库。
数据模型语法(data-model syntax)提供了丰富的用来表示你的模型的方法,它已经被用于解决数据库构架问题很多年了。如下是一个简单的例子:

   
   
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


  
  

安装它

接下来,启用Django命令行来自动创建数据库表格
$ python manage.py migrate

migrate命令将会查看你都所有可用的模型,并在数据库中为那些没有表格的模型创建表格,同时提供你更丰富的模型控制(much
 richer schema control)



享受这些不受约束的API

有了这个,你就拥有了不受约束的、丰富的DjangoPython API来访问你都数据库。API是即时创建的,不需要代码生成:
#导入我们给“nwes”APP创建的模型
>>> from news.models import Reporter, Article
#这时,系统中还没有“记者”
>>> Reporter.objects.all()
<QuerySet []>

#创建一个新的“记者”
>>> r = Reporter(full_name='John Smith')
#要想将对象存入数据库中,你必须明确调用'save()'
>>> r.save()
#给他一个ID
>>> r.id
1
#现在,这个新的“记者”已经在你的数据库中了
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>
#名字字段在Python对象中表示为一个属性
>>> r.full_name
'John Smith'
#Django提供了丰富的数据库查看接口
>>> 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.

#新建一篇“文章”
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()
#现在“文章”已经存入数据库了
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]
#“文章”对象可以通过接口查看“记者”对象
>>> r = a.reporter
>>> r.full_name
'John Smith'
#反过来同样,可以通过“记者”对象查看“文章对象”
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]
#API接口可以根据需要按照关系高效率地执行#JOINs for you behind the scens(这句实在不会翻译了。。。)#如下将会返回所有以“John”为名字开头的对象的文章
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>
#通过改变属性来更改对象,同时调用save()来保存
>>> r.full_name = 'Billy Goat'
>>> r.save()
#通过调用delete()来删除一个对象
>>> r.delete()

动态管理界面:这不仅仅是一个框架,这是整座屋子

一旦你定义了你的模型,Django就会自动创建一个专业的几乎成形的管理界面(administrative interface)——一个可以让经过认证的用户添加、更改、删除对象的网站。这与在管理站点注册模型一样简单。


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 apps的一个经典套路就是你设计好模型并以最快的速度启动管理站点,然后你就可以交给员工(或是客户)来上传数据。然后将开发数据的方法设计为public(编者暂时无法理解最后一句话,暂时理解为尽快将数据操作接口做出来)

设计网址(URL)

在高质量的网页应用开发中,一个优雅的URL组合是非常重要的细节。Django鼓励设计好看的URL,不要把那些什么.php、.asp讨厌的字符加到URL里边!=3=

要为应用设计URL,你需要创建一个Python模型叫做URLconf。这是应用内容的表格,它包含了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的地方停下。(如果没有匹配的URL,Django将会调用404视图=。=)路径加载时会被编译成正则表达式,所以这个过程就跟开火箭似的。
一旦找到一个匹配的URLDjango将会调用指定的视图,一个Python函数。每个视图都会传递一个包含请求元数据以及模式中获取的值的请求对象。

举个例子:如果我们请求URL"/articles/2005/05/39323/", Django会调用函数 Django news.views.article_detail(request, year = 2005, month = 5,pk = 39323)

编写你的视图(views)

每个视图都要执行如下两项操作中的一项:返回包含请求页面内容的 HttpResponse对象;或者引发异常(如Http404),其余的由你决定。

按照国际惯例,视图会根据参数检索数据,加载检索来的数据来呈现模板( template)。下边是一个 Djangoyear_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模板系统(template system),这个系统有多个强大的功能,同时它也在努力做到让不是码农的人也能用他。

设计你的模板(templates)

上边的代码加载了 news/year_archive.html 模板。

Django拥有一个模板搜索路径,可以让模板间的冗余最小化。在 Django的设置( settings)中,你可以指定一个目录列表通过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风格的“通道”(“|”字符)。这叫模板过滤器,它可以用来过滤变量值。在这个示例中,日期过滤器以给定的格式来格式化Python日期时间对象(如同PHP的日期函数)。

你可以链接无数个过滤器。你可以编写 自定义模板过滤器(custom template filters)。你可以自己编写在后台运行Python代码的 自定义模板标签(custom template tags)

最后, Django使用了“集成模板”这一概念。即{% extends"base.html" %},意思是“先加载名为‘base’的模板,它已经定义了一堆块,用下面的块来填充块。”简单来说,这可以大大减少模板中的冗余:每个模板只需要定义这个模板与其他模板都不一样的、唯一的内容。

以下是包含了 静态文件(static files)的“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的模板系统=3=。尽管 Django的模板系统和 Django的模型层结合的非常好,但是没人逼你用=3=。同样的,你也不是非要用 Django的数据库接口,你可以用其他的数据库抽象层,你可以从磁盘读取文件,你可以读取XML文件,你可以做很多你想做的事情( ̄▽ ̄* )ゞ。每一个Django模型、视图、模板都与下一个耦合。

这些只是冰山一角

这仅仅是 Django功能的简短概览。如下有一些很有用的功能:
  • 与mecached或其他后端集成的缓存框架(caching framework)
  • 一个让创建RSS、Atom和编写Python类一样简单的联合框架(syndication framework)
  • 更生动的自动生成管理功能,上边这个概述只是提到了一些表面功能。

接下来,你可以去下载Django,阅读教程(the tutorial),或者加入社区

感谢你的支持!



    
    


    
    
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值