Django教程之一-----Django一瞥

来源:互联网 发布:北京哪个java培训班好 编辑:程序博客网 时间:2024/05/18 14:44

因为Django是在一个快节奏的新闻室环境下开发的,它设计的目的就是让大众的Web开发任务变得快和简单。下面是一份非正式的概述,关于如何用Django写一个数据库驱动的Web应用。


这份文档的目的是提供足够的教学指导,让你理解Django是如何工作的,但这不是一个教程或者参考--它兼容了2者!


1.设计你的model

尽管你可以不用数据来使用Django,但是它有一个对象关系映射器,在哪里你可以在你的Python代码中描述你的数据库布局。

数据模型的语法提供了展示你模型的丰富的方式---目前为止,它已经解决了血多年的数据库模式问题。下面是一个简单那的例子:
mysite/news/models.pyfrom django.db import modelsclass Reporter(models.Model):    full_name = models.CharField(max_length=70)    def __str__(self):              # __unicode__ on Python 2        return self.full_nameclass 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.安装

下一步,运行Django命令行功能来自动创建一个数据库的表:

$ python manage.py migrate

migrate命令寻找所有你可用的模型并且在你的没有表的数据库中创建表,同样可以选择提供更丰富的模式控制。

3. 享受免费的API

有了这个,你就得到了一个免费的,丰富的Python API来访问你的数据。API是动态创建的,没有生成代码的必要:

# Import the models we created from our "news" app>>> from news.models import Reporter, Article# 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.id1# 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()

4. 动态管理界面:不仅仅是教授教--它是整个房子

一旦你的模型定义好了,Django能自动创建一个专业的,生产就绪的管理接口--一个允许已验证用户添加,删除和修改对象的网站。这就像在管理网站上注册你的模型一样简单:

mysite/news/models.pyfrom django.db import modelsclass 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.pyfrom django.contrib import adminfrom . import modelsadmin.site.register(models.Article)

这里的原理是,你的站点是由一个员工,一个客户,或者可能就是你来编辑的--并且你不想并且不必处理创建后端接口来管理内容。


在创建Django应用时一个典型的工作流程是创建模型,然后让管理站点运行起来并且越快越好,然后你的员工能开始填充数据。然后开发呈现给大众的数据的方式。

4. 设计你的URLs

简洁,高雅的URL模式是高质量web应用中的一个重要细节。Django鼓励漂亮的URL设计,并且不会将任何粗糙的东西田间到URLs中,例如.php或者.asp。


为了设计一个应用的URLs,你需要创建一个名为URLconf的Python模型。一个包含你应用内容的表,它包含一个在URL模式和Python回调函数之间的映射。URLconfs同样用来从Python代码中解耦你的URLs。


下面是一个URLconf可能的样子,对于上面的Reporter/Article来说:

from django.conf.urls import urlfrom . import viewsurlpatterns = [    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的回调函数(‘view’)地址中。正则表达式使用圆括号来从URLs中‘捕获’值。当用户请求一个页面,Django浏览每一个模式,按顺序的,并且停止在第一个匹配请求URL的地方。(如果没有一个匹配,Django会调用一个特殊的视图 404)这非常的快,因为正则表达式在加载的时候就编译了。


一旦有一个正则表达式匹配,Django将会调用给定的视图,它是一个Python的函数。每一个视图都会传递一个请求对象--包含请求元数据--和在正则表达式中捕获的值。


例如,如果一个用户请求的URL是 "/articles/2005/05/39323/",Django将会调用函数news.views.article_detail(request,'2005','05','39323')。

5. 编写你的视图

每一个视图都负责1到2件事情:返回一个HttpResponse对象,包含被请求页面,或者抛出一个类似Http404的一场,其他的取决于你。

一般的,一个视图根据参数来提取数据,加载一个模板并且使用提取的数据来渲染模板。下面是year_archive视图的一个例子:

mysite/news/views.pyfrom django.shortcuts import renderfrom .models import Articledef 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的模板系统,这个系统有几个强大的特征,但是努力保持简单以让非程序员使用。

6. 设计你的模板

上面的代码加载news/year_archive.html模板


Django有一个模板搜索路径,它允许你最小化冗余。在你的Django设置中,你使用DIRS来制定一个字典的列表来检查模板。如果模板不再第一个字典中,它就检查第二个,等等。


让我们看看news/year_archive.htm模板是怎么被发现的。下面是它大概的样子:

{% 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风格的“管道”(“|”字符)。这被称为模板过滤,并且它是一种过滤变量值的方式。这种情况下,数据过滤以给定的形式格式化了一个Python日期时间对象(和PHP的日期函数一样)。


你可以把任意多的过滤器链在一起。你可以写自定义模板过滤器。你可以写自定义模板标签,它在幕后运行自定义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),并且提供了给子模板填充的“洞”。这让一个站点的舌边变的如果改变一个文件那样容易--base模板。


它同样让你用不同的模板创建站点的不同版本,模板可以重复使用子模板。Django的创造者使用这项技术创建了截然不同的站点版本--仅仅是创建一个新的base模板。


注意如果你偏爱另一个系统你不必要使用Django的模板系统。虽然Django的模板系统和Django的模型层集成在一起,但是没有什么能强制你使用它。同理,你也可以不必使用Django的数据库API。你可以使用另外的数据库抽象层,你可以读取XML文件,你可以读取硬盘的文件,或任何你想的东西。Django的每一个东西--模型,视图,模板--都和其他的是解耦的。

7. 这只是冰山一角

上面就是关于Django功能的一个大致轮廓。一些有用的特性:

  • 一个继承分布式缓存或其他后端的缓存框架
  • 一个联合框架,让创建RSS和提要变得像写一个小的Python类一样简单
  • 更性感的自动生成管理特性--这个概述并没有涉及到。

原创粉丝点击