初识 Django

引言

最初的想法很简单:没有学会一门脚本语言的程序员不是好程序员。带这个这个想法我选择了 Python,在看了点《Python 核心编程》后就想能不能找个开源项目边做边学,现在开源项目这么火爆,我也去尝尝鲜。于是我发现了 Django。认识了 Django 后,我突然发现架一个个人网站的梦想貌似有希望了(毕业后从事 MFC 的工作,对 Web 的世界不是很了解/(ㄒoㄒ)/~~)。

于是我的个人主页就诞生了:http://aquariushome.duapp.com/
在写这个主页的时候一直想写一些有关 Django 的东西,记录自己的所学。可发现自己的语言组织能力差,对 Django 的了解也不够深。不知不觉,网址写完了,可文章确没有。感觉还是写点东西吧,巩固一下,加深理解,记下来怕以后忘了。
但已经不知道从何写起,于是乎干脆去翻译官方文档。Django book 貌似很久没更新的样子,英语能力不怎么好,就不一一翻译,按自己的理解做一些记录。
啰嗦完毕~~

官方原文:https://docs.djangoproject.com/en/1.8/intro/overview/

初始 Django

Django 是从快节奏的新闻编辑部环境中开发出来的,所以它很适合用于搭建通用的 Web 引用。这里我们来研究下如何使用 Django 编写一个数据库驱动的 Web 应用。
这份文档不是 Django 的教程,只是大体的介绍 Django 是怎么运作的。

设计你的 model

Django 使用了数据对象映射器,让你通过 Python 代码来设计和操作数据库。
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
        retrun self.full_name

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter)
    def __str__(self):  ## __unicode__ on python 2
        return self.headline

写入数据库

接下来,使用运行 Django 的使用工具命令来自动的创建数据库表。

$ python manage.py migrate

migrate 命令会扫描所有有效的 model,并根据选项创建数据库表。

API

Django 提供丰富的 Python API 来访问数据。

# 导入 models 模块
>>> from news.models import Reporter, Article

# 数据库中还没有数据
>>> Reporter.objects.all()
[]

# 常见一个 Reporter
>>> r = Reporter(full_name='John Smith')

# 显示的调用 save() 方法,保存到数据库
>>> r.save()

# 现在他就有 ID 了
>>> r.id
1

# 已经保存到数据库
>>> Reporter.objecs.all()
[<Reporter: John Smith>]

# 数据库字段在 Python 中表现为对象属性
>>> r.full_name
'John Smith'

# Django 提供了丰富的方式访问数据库
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Report.objects.get(full_name__startswith='John')
<Reporter: John Smith>
>>> Report.objects.get(full_name_contains='mith')
<Reporter: John Smith>
>>> Report.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>]

# Article 对象通过 API 访问与其关联的 Reporter 对象
>>> r = a.reporter
>>> r.full_name
'John Smith'

# 反过来:Reporter 对象通过 API 反问 Article 对象
>>> r.article_set.all()
[<Article: Django is cool>]

# API 在幕后执行者你需要的关系查询,下面是要查询名字以 John 开头的 Reporter 的所有文章
>>> Article.objects.filter(reporter__full_name_startswith='John')
[<Article: Django is cool>]

# 通过修改属性和调用保存方法来改变一个对象
>>> r.full_name = 'Billy Goat'
>>> r.save()

# 调用 delete() 方法来删除一个对象
>>> r.delete()

动态管理接口

当你模型定义好后, Django 会自动的创建一个专业的后台管理接口 —- 一个 Web 站点,通过认证的用户可以在站点上增加、修改、删除对象。注册你的模型到管理站点很简单:

mysite/news/models.py

from Django.db import models
class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_legth=200)
    content = models.TextField()
    reprter = models.ForeignKey(Reporter)


mysite/news/admin.py

from django.contrib import admin
from . import models
admin.site.register(models.Article)

这里的哲学思想是:不通过人工的创建后台管理接口,就能让你的员工或用户编辑站点。一个典型的创建 Django 应用的流程是,创建模型,注册管理站点,快速的录入数据,发布数据。

设计 URLs

一个优雅的 URL 方案设计对一个高质量的 Web 应用来说是很重要的。Django 鼓励漂亮简洁的 URL 设计,不会有任何像 .php 或 .asp 这样令人讨厌的东西在 URL 里。
创建一个 URL 配置模块,配置模块包含一个 URL 模式(正则表达式的模式)和 Python 回调函数的映射表。URL 配置达到了解耦的目的。
接下来我们来看下例子:

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.moth_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

以上代码中, 通过正则表达式映射 URL 到 views 中的回调函数。当用户请求页面时,正则表达式通过括号捕获到 URL 中的值。Django 一次匹配正则表达式,匹配到则返回,如果没有匹配到则返回 404 错误页,这个过程是很迅速的,因为在加载时正则表达式已经编译过了。
正则表达式一旦匹配, Django 便导入指定的 view 模块,并调用 指定的 view 中的函数,通过正则表达式捕获到参数传递参数。
例如,如果一个用过的请求 URL 是 “/articles/2005/05/39323”, Django 将会调用函数 news.views.article_detail(request, ‘2005’, ‘05’, ‘39323’)

编写你的 views

每一个 view 负责返回包含了请求返回内容的 HttpRespnse 对象,或者是引发异常,如 Http404.
通常 view 通过参数查询数据,加载模板,渲染模板然后返回请求。看下面例子:

mysite/news/views.py

from django.shortcuts import render
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)

设计你的模板

上面的代码加载了 news/year_archive.html 模板。
Django 有一个模板搜索路径,在你的 Django settings 中指定了模板搜索路径列表,Django 依次搜搜这个列表中的路径,直到找到模板。
我们来看下 news/year_archicve.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 的 headline 属性。点号不仅表示引用属性,也可以是字典或是函数调用。
{{ article.pub_date|date:”F j, Y”}} 使用了 Unix 风格的管道符 “|”。在 Django 中这叫过滤器,它提供了过滤变量的方法。在这个例子中,时间变量被按照 Python 给的格式输出。
你可以把多个过滤器连接在一起,还可以自定义过滤器,可以自定义模板标签和背后运行的 Python 代码。
最后,Django 使用了模板继承的概念。标签 {% extends “base.html” %} 表示首先加载名为 base.html 的模板, base.html 模板有一堆的 blocks 标签组成。这样大大减少了模板的冗余度。
我们来看一下 base.html 模板的定义:

mysite/template/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 系统中的一部分,Django 系统的耦合性很低,如果你有更合适你的系统,你可以不使用 Django 的模板系统。同样,Dajngo 的 datase API,也可以单独使用后不使用。Django 的 model, views, templates 是互相解耦的三个系统模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值