Django安装
安装Django
- pip3 install django
测试你的安装
>>> import django
>>> print(django.get_version())
1.10
创建你的Django项目
- django-admin.py startproject mysite
这个命令竟会运行django-admin.py脚本,它将会为你创建一个名叫mysite的Django新项目.这个名字随便你取的.
在你新创建的mysite项目里自动创建了两个项目:
- 一个和mysite同名的目录.
- 一个叫manage.py的Python脚本
以下为这几个脚本的用途:
__init__.py
:这是一个空的脚本,用来告诉Python编译器这个目录是一个Python包.- settings.py:用来存储Django项目设置的文件.
- urls.py:用来存储项目里的URL模式.
- wsgi.py:用来帮助你运行开发服务,同时可以帮助部署你的生产环境.
在项目里还有一个叫做manage.py的文件.这个文件是我们开发项目时经常使用的文件,它为我们提供了一系列的Django命令.例如,manage.py允许你运行内建的Django服务来测试和运行数据库命令.真的,这个脚本是你最常用的脚本了.
启动你的项目
运行manage.py脚本,启动项目
[root@yang ]# python3 manage.py runserver 0.0.0.0:8000
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
August 29, 2016 - 15:51:27
Django version 1.10, using settings 'Djanjo.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
检查启动
[root@yang ]# python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK
migrate命令会检查你的INSTALLED_APPS设置,同时会创建你的mysite/settings.py文件中相关的app的数据库图表(我们稍后会介绍).你将会看到所有初始化的信息.
现在你就可以通过浏览器直接访问了 http://127.0.0.1:/8000
创建Django应用
__1). __ 通过一系列的设置和各种应用就可以组成一个web应用和网站,每个Django应用的存在都对应它实现的一种功能.针对不同的功能你需要创建不同的应用.
[root@yang-200-87 /home/yang/mysite]# python3 manage.py startapp rango
这个命令在你的项目根目录里创建了一个新的名叫rango的目录 - 这里面包含了5个Python脚本:
__init__
.py,这是一个空的脚本,用来告诉Python编译器这个目录是一个Python包.- models.py,一个存储你的应用中数据模型的地方 - 在这里描述数据的实体和关系.
- tests.py,存储你应用的测试代码.
- views.py,在这里处理用户请求和响应.
- admin.py,在这里你可以向Django注册你的模型,它会为你创建Django的管理界面.
views.py和models.py在每个应用中都要用到,他们俩是Django设计模式的组成部分,例如Model-View-Template模式.
__2). __ 在你创建模型和视图之前,你必须要告诉Django你的新应用的存在.所以你必须修改你配置目录里的settings.py文件.打开文件找到INSTALLED_APPS元组.在元祖的最后面增加rango:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rango',
]
__3). __ 既然我们已经创建好Rango,让我们创建一个简单的视图.作为我们的第一个视图,我们就简单的把文本传送给客户端 - 我们现在不必关心模型或者模板:
from django.shortcuts import render
from django.http import HttpResponse
def test(request):
return HttpResponse('This is my first Django page!')
- 我们第一行首先从django.http模块导入HttpResponse对象.
- 在views.py文件里每个视图对应一个单独的函数.在这个例子中我们只创建了一个test视图.
- 每个视图至少带一个参数 - 一个在django.http模块的HttpRequest对象.
- 每个视图都要返回一个HttpResponse对象.本例中这个HttpResponse对象把一个字符串当做参数传递给客户端.
URL映射
__1). __ 在rango目录里,我们需要创建一个叫做urls.py的文件.文件里是可以设置你的应用映射到URL:
from django.conf.urls import url
from rango import views
urlpatterns = [
url(r'test', views.test, name='test'),
]
__2). __ 打开项目目录中的 urls.py文件,添加映射:
from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^rango/', include('rango.urls')),
]
新增的映射将会寻找匹配^rango/的url字符串.如果匹配成功的话将会传递给rango.urls(我们已经设置过了).include()函数是从django.conf.urls导入的.整个URL字符串处理过程如下图所示.在这个过程中,域名首先被提取出来然后留下其他的url字符串(rango/)传递给我们的tango_with_django_project,在这里它会匹配并去掉rango/然后把空字符串传递给rango应用.Rango现在匹配一个空字符串,它会返回我们创造的test()视图.
使用模板
__1). __ 设置模板目录
为了建立和启动模板,你需要设置一个储存模板的目录.
在你的Django项目目录(mysite)里,创建一个新的目录叫做templates.在这个目录里创建另一个rango目录.所以我们将在mysite/templates/rango/目录里存放关于rango应用的模板.
为了告诉Django我们的模板在哪里,我们需要修改项目的settings.py文件.找到TEMPLATE_DIRS并把创建的templates目录路径加入到里面:
TEMPLATE_PATH = os.path.join(BASE_DIR,'templates')
TEMPLATE_DIRS = [
TEMPLATE_PATH,
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': TEMPLATE_DIRS,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
__2). __ 添加模板
在我们创建模板目录和设置好路径以后,我们需要在template/rango/目录里建立一个叫做index.html的文件,在新文件里加入下面代码:
<!DOCTYPE html>
<html>
<head>
<title>Rango</title>
</head>
<body>
<h1>Rango says...</h1>
hello world! <strong>{{ boldmessage }}</strong><br />
<a href="/rango/about/">About</a><br />
</body>
</html>
这个HTML代码创建一个问候用户的简单HTML页面.你可能注意到了在上面有一段非HTML代码{{boldmessage}}.这是Django模板的变量,他可以在输出时为这个变量赋值.一会我们就会用它.
为了使用这个模板,我们需要在rango/views.py里添加如下代码:
def index(request):
context_dict = {'boldmessage':"i am bold font form the context"}
return render(request,'rango/index.html', context_dict)
为此模板添加URL映射:
urlpatterns = [
url(r'yang', views.yang, name='yang'),
url(r'index', views.index, name='index'),
]
首先我们建立一个在模板中使用的字典,然后我们调取render()函数.这个函数接受用户的request,模板名称和内容字典作为参数.这个render()函数将会把这些参数聚合到一起生成一个完整的HTML页面.然后返回给用户的浏览器.
当模板文件被加载到Django模板系统里时,它模板内容也会被创建.在简单的例子里模板的内容是字典里的模板变量对应的Python变量.在我们早先创建的模板文件,我们创建了一个叫做boldmessage的模板变量.在index(request)视图例子中,字符串I am bold font from the context映射到模板变量boldmessage.所以字符串I am bold font from the context将会替换模板里所有的{{ boldmessage }}.
__3). __ 使用静态媒体
为了增加样式和引入动态行为我们可以在我们的网站里加入CSS,Javascript和图像这些静态媒体.这些文件和网页有一些不同.这是因为它们不想HTML页面是生成出来的.
3.1). 设置静态媒体目录
为了设置静态媒体,你需要设立存储它们的目录.在你的项目目录,创建叫做static的目录.在static里再创建一个images目录. 并在statec/images目录里放一张图片123.jpg
。
我们需要告诉Django我们创建了static目录.在settings.py文件,我们需要更新两个变量STATIC_URL和STATICFILES_DIRS元组,像下面一样创建一个储存静态目录(STATIC_PATH)的变量:
STATIC_URL = '/static/'
STATIC_PATH = os.path.join(BASE_DIR,'static')
STATICFILES_DIRS = (
STATIC_PATH,
)
-
第一个变量STATIC_URL定义了当Django运行时Django应用寻找静态媒体的地址.例如,像我们上面的代码一样吧STATIC_URL设置成/static/,我们就可以通过http://127.0.0.1:8000/static/来访问它了.
-
STATIC_URL定义了web服务链接媒体的URL地址,STATICFILES_DIRS允许你定义新的static目录.像TEMPLATE_DIRS元组一样.STATICFILES_DIRS需要static目录的绝对路径.这里,我们重新用5.1章的BASE_DIR变量来创建STATIC_PATH.
-
完成了这两个设置后,再一次运行你的Django服务.如果我们想要查看我们的Rango图片,访问http://127.0.0.1:8000/static/images/123.jpg.
__3.2). __ 现在你已经为你的Django项目设置了静态媒体,你可以在你的模板里加入这些媒体.
修改HTML源码,加入文件引用:
<!DOCTYPE html>
{% load staticfiles %}
<!-- New line -->
<html>
<head>
<title>Rango</title>
</head>
<body>
<h1>Rango says...</h1>
hello world! <strong>{{ boldmessage }}</strong><br />
<a href="/rango/about/">About</a><br />
<img src="{% static "images/rango.jpg" %}" alt="Picture of Rango" /> <!-- New line -->
</body>
</html>
首先,我们需要使用{% load static %}标签来使用静态媒体.所以我们才可以用{% static "rango.jpg" %在模板里调用static文件.Django模板标签用{ }来表示.在这个例子里我们用static标签,它将会把STATIC_URL和123.jpg连接起来,如下所示:
<!DOCTYPE html>
{% load static %}
<html>
<head>
<title>Rango</title>
</head>
<body>
<h1 class="c1">Rango says...</h1>
hello world! <strong>{{ boldmessage }}</strong><br />
<a href="/rango/yang/">About</a><br />
<img src = "{% static "images/123.jpg" %}" alt="Picture of Rango" />
</body>
</html>
当你希望在模板里使用静态媒体你需要调用{% static %}函数.下面的代码将展示给你如何在你的模板里添加Javascript,CSS和图片:
<!DOCTYPE html>
{% load static %}
<html>
<head>
<title>Rango</title>
<link rel="stylesheet" href="{% static "css/base.css" %}" /> <!-- CSS -->
<script src="{% static "js/jquery.js" %}"></script> <!-- JavaScript -->
</head>
<body>
<h1 class="c1">Rango says...</h1>
hello world! <strong>{{ boldmessage }}</strong><br />
<a href="/rango/yang/">About</a><br />
<img src = "{% static "images/123.jpg" %}" alt="Picture of Rango" />
</body>
</html>
模型和数据库
通常来说处理数据库需要我们掌握许多复杂的SQL语句.但是在Django里,对象关系映射(ORM)帮我们处理这一切,包括通过模型创建数据库表.事实上,模型是描述你的数据模型/图表的一个Python对象.与以往通过SQL操作数据库不同,你只用使用Python对象就能操作数据库.在本章,我们将会学习如何设立数据库并为Rango建立模型.
__1). __ 告诉 Django 你的数据库
在你创造任何模型之前都要对你的数据库进行设置.在Django1.7,当你创建了一个项目,Django会自动在settings.py里添加一个叫做DATABASES的字典.它包含如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
__2). __ 创建模型
在rango/models.py里,我们定义两个继承自djnago.db.models.Model的类.这两个类分别定义目录和页面.定义Category和Page如下:
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=128,unique=True)
def __unicode__(self):
return self.name
class Page(models.Model):
category = models.ForeignKey(Category)
title = models.CharField(max_length=128)
url = models.URLField()
views = models.IntegerField(default=0)
def __unicode__(self):
return self.title
当你定义了一个模型,你需要制定可选参数的属性以及相关的类型列表.Django提供了许多内建字段.一些常用的如下:
- CharField,存储字符数据的字段(例如字符串).max_length提供了最大长度.
- URLField,和CharField一样,但是它存储资源的URL.你也可以使用max_length参数.
- 'IntegerField',存储整数.
- DateField,存储Python的datetime.date.
Django也提供了连接模型/表的简单机制.这个机制封装在3个字段里,如下:
- ForeignKey, 创建1对多关系的字段类型.
- OneToOneField,定义一个严格的1对1关系字段类型.
- ManyToManyFeild,当以多对多关系字段类型.
__3.) __ 创建和迁移数据库
我们定义了模型,那么Django就能很好的自动创建我们的数据库.
python3 manage.py migrate
当你更改模型的时候,你需要通过makemigrations进行修改,所以对于rango,我们需要:
python3 manage.py makemigrations rango
__4.) __ Django模型和Django Shell
在我们把注意力集中到Django管理界面之前,通过Django shell创建Django模型也是值得一试的 - 它对我们debug非常有用.下面我们将展示如何用这种方式来创建Category实例.
为了得到shell我们需要再一次调用Django项目根目录里的manage.py.
python3 manage.py shell
这个实例将会创建一个Python解析器并且载入你的项目的设置.你可以和模型进行交互.下面的命令展示了这一功能.注释里可以看到每个命令的功能: