安装环境:
uname -r
14.04.1-Ubuntu x86_64 x86_64 x86_64 GNU/Linux
ubuntu自带python 2.7.6
https://www.djangoproject.com/download/下载
django-1.6.11.tar.gz
配置ubuntu机器基本环境
root@sige-virtual-machine:~# cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.136
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8
root@sige-virtual-machine:~# cat /etc/resolvconf/resolv.conf.d/base
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 114.114.114.114
root@sige-virtual-machine:~# resolvconf -u
reboot重启系统
将虚拟机的网络连接到,网络连接桥接模式直接连接物理机,这样子就可以ping root@sige-virtual-machine:~#www.baidu.com了
ping -c 3 www.baidu.com
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
64 bytes from 61.135.169.121: icmp_seq=1 ttl=50 time=24.3 ms
64 bytes from 61.135.169.121: icmp_seq=3 ttl=50 time=24.2 ms
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 2 received, 33% packet loss, time 2010ms
rtt min/avg/max/mdev = 24.224/24.282/24.341/0.166 ms
修改ubuntu的命令提示符
vim ~/.bashrc
56 PS1='${debian_chroot:+($debian_chroot)}[\u@\h\w]\$ ' ##自己的机器
source ~/.bashrc
这样子提示符就变成自己喜欢的了[root@sige~]#看着真舒服。
怎么用FileZilla连接ubantu系统
sudo apt-get install openssh-server openssh-client
/etc/init.d/ssh restart
FileZilla软件里输入sftp://192.168.1.136 sige 123456
其他的不多说了,看的懂得不用说,看不懂的说了也等于白说。
上传自己下载的Django-1.6.11.tar.gz,当然你也可以用wget下载资源。
然后就是源码编译3步走了
tar -zxvf Django-1.6.11.tar.gz
cd Django-1.6.11/
python setup.py install
cd /root
django-admin.py startproject HelloWorld
创建HelloWorld第一个项目
apt-get install tree
[root@sige~/HelloWorld]# tree
.
|-- HelloWorld
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
`-- manage.py
我的项目都在这里了。
python manage.py runserver 0.0.0.0:8000
在浏览器里输入IP和端口
http://192.168.1.136:8000
在先前创建的 HelloWorld 目录下的 HelloWorld 目录新建一个 view.py 文件,并输入代码:
cat view.py
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world ! ")
接着,绑定 URL 与视图函数。打开 urls.py 文件,删除原来代码,将以下代码复制粘贴到 urls.py 文件中:
from django.conf.urls import *
from HelloWorld.view import hello
urlpatterns = patterns("",
('^hello/$', hello),
)
整个目录结构如下:
[root@sige~/HelloWorld]# tree
.
|-- HelloWorld
| |-- __init__.py
| |-- __init__.pyc
| |-- settings.py
| |-- settings.pyc
| |-- urls.py # url 配置
| |-- urls.pyc
| |-- view.py # 添加的视图文件
| |-- view.pyc # 编译后的视图文件
| |-- wsgi.py
| `-- wsgi.pyc
`-- manage.py
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
完成后,启动 Django 开发服务器,并在浏览器访问打开浏览器并访问:
http://192.168.1.136:8000/hello
就出来hello world!啦
在 HelloWorld 目录底下创建 templates 目录并建立 hello.html文件,整个目录结构如下:
[root@sige~/HelloWorld]# mkdir templates
[root@sige~/HelloWorld]# tree
HelloWorld/
|-- HelloWorld
| |-- __init__.py
| |-- __init__.pyc
| |-- settings.py
| |-- settings.pyc
| |-- urls.py
| |-- urls.pyc
| |-- view.py
| |-- view.pyc
| |-- wsgi.py
| `-- wsgi.pyc
|-- manage.py
`-- templates
`-- hello.html
[root@sige~/HelloWorld/templates]# cat hello.html
<h1>{{ hello }}</h1>
从模板中我们知道变量使用了双括号。
接下来我们需要向Django说明模板文件的路径,修改HelloWorld/settings.py,修改 TEMPLATES 中的 DIRS 为[BASE_DIR+"/templates",],如下所示:
[root@sige~/HelloWorld/HelloWorld]# cat settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
SETTINGS_PATH = os.path.dirname(__file__)
PROJECT_PATH = os.path.join(SETTINGS_PATH, os.pardir)
PROJECT_PATH = os.path.abspath(PROJECT_PATH)
TEMPLATES_PATH = os.path.join(PROJECT_PATH, "templates") #模板路径
我们现在修改 view.py,增加一个新的对象,用于向模板提交数据:
[root@sige~/HelloWorld/HelloWorld]# pwd
/root/HelloWorld/HelloWorld
[root@sige~/HelloWorld/HelloWorld]# cat view.py
# -*- coding: utf-8 -*-
#from django.http import HttpResponse
from django.shortcuts import render
def hello(request):
context = {}
context['hello'] = 'Hello World!'
return render(request, 'hello.html', context)
可以看到,我们这里使用render来替代之前使用的HttpResponse。render还使用了一个字典context作为参数。
context 字典中元素的键值 "hello" 对应了模板中的变量 "{{ hello }}"。
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
再访问访问http://192.168.1.136:8000/hello/,可以看到页面:
大写的Hello World!
模板可以用继承的方式来实现复用。
接下来我们先创建之前项目的 templates 目录中添加 base.html 文件,代码如下:
[root@sige~/HelloWorld/templates]# pwd
/root/HelloWorld/templates
[root@sige~/HelloWorld/templates]# cat base.html
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
{% block mainbody %}
<p>original</p>
{% endblock %}
</body>
</html>
以上代码中,名为mainbody的block标签是可以被继承者们替换掉的部分。
所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。
hello.html中继承base.html,并替换特定block,hello.html修改后的代码如下:
[root@sige~/HelloWorld/templates]# pwd
/root/HelloWorld/templates
[root@sige~/HelloWorld/templates]# cat hello.html
{% extends "base.html" %}
{% block mainbody %}
<p>继承了 base.html 文件</p>
{% endblock %}
第一行代码说明hello.html继承了 base.html 文件。可以看到,这里相同名字的block标签用以替换base.html的相应block。
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
重新访问地址http://192.168.45.3:8000/hello/,输出结果如下:
http://192.168.1.136:8000/hello/
Hello World!
继承了 base.html 文件
接下来就是操作数据库了
apt-get install mysql-server
service mysql start
ps aux | grep mysql
mysql -uroot -p123456
mysql> create database test;
我们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:
[root@sige~/HelloWorld/HelloWorld]# pwd
/root/HelloWorld/HelloWorld
[root@sige~/HelloWorld/HelloWorld]# cat settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': '123456',
'HOST': 'localhost',
'PORT': '3306',
}
}
上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户连接起来。
Django规定,如果要使用模型,必须要创建一个app。我们使用以下命令创建一个 TestModel 的 app:
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py startapp TestModel
目录结构如下:
[root@sige~/HelloWorld]# tree
HelloWorld
|-- TestModel
| |-- __init__.py
| |-- admin.py
| |-- models.py
| |-- tests.py
| `-- views.py
我们修改 TestModel/models.py文件,代码如下:
[root@sige~/HelloWorld/TestModel]# cat models.py
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20)
以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。
接下来在settings.py中找到INSTALLED_APPS这一项,如下:
[root@sige~/HelloWorld/HelloWorld]# pwd
/root/HelloWorld/HelloWorld
[root@sige~/HelloWorld/HelloWorld]# cat settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel', ###添加此项
)
在命令行中运行python manage.py syncdb,看到几行"Creating table…"的字样,你的数据表就创建好了。
[root@sige~/HelloWorld/HelloWorld]# sudo apt-get install python-mysqldb
[root@sige~/HelloWorld/HelloWorld]# python manage.py syncdb
接下来我们在 HelloWorld 目录中添加 testdb.py 文件,并修改urls.py:
[root@sige~/HelloWorld/HelloWorld]# pwd
/root/HelloWorld/HelloWorld
[root@sige~/HelloWorld/HelloWorld]# cat testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
#from TestModel.models import Test
# 数据库操作
def testdb(request):
test1 = Test(name='w3cschool.cc')
test1.save()
return HttpResponse("<p>数据添加成功!</p>")
添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:
[root@sige~/HelloWorld/HelloWorld]# cat urls.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Test
# 数据库操作
def testdb(request):
test1 = Test(name='w3cschool.cc')
test1.save()
return HttpResponse("<p>数据添加成功!</p>")
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
访问http://192.168.1.136:8000/testdb/ 就可以看到数据添加成功的提示。
如何用Django对用户提交的表单数据进行处理?
[root@sige~/HelloWorld/HelloWorld]# pwd
/root/HelloWorld/HelloWorld
[root@sige~/HelloWorld/HelloWorld]# cat search.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render_to_response
# 表单
def search_form(request):
return render_to_response('search_form.html')
# 接收请求数据
def search(request):
request.encoding='utf-8'
if 'q' in request.GET:
message = '你搜索的内容为: ' + request.GET['q'].encode('utf-8')
else:
message = '你提交了空表单'
return HttpResponse(message)
[root@sige~/HelloWorld/templates]# pwd
/root/HelloWorld/templates
[root@sige~/HelloWorld/templates]# cat search_form.html
<html>
<head>
<meta charset="utf-8" />
<title>Search - w3cschool.cc</title>
</head>
<body>
<form action="/search/" method="get">
<input type="text" name="q">
<input type="submit" value="Search">
</form>
</body>
</html>
urls.py 规则修改为如下形式:
[root@sige~/HelloWorld/HelloWorld]# pwd
/root/HelloWorld/HelloWorld
[root@sige~/HelloWorld/HelloWorld]# cat urls.py
from django.conf.urls import *
from HelloWorld.view import hello
from HelloWorld.testdb import testdb
from HelloWorld import search
urlpatterns = patterns("",
('^hello/$', hello),
('^testdb/$', testdb),
(r'^search-form/$', search.search_form),
(r'^search/$', search.search),
)
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
浏览器里访问地址:http://192.168.1.136:8000/search-form/并搜索,里面填上搜索的内容点击search就看到东西啦。
上面我们使用了GET方法。视图显示和请求处理分成两个函数处理。
提交数据时更常用POST方法。我们下面使用该方法,并用一个URL和处理函数,同时显示视图和处理请求。
我们在tmplate 创建 post.html:
[root@sige~/HelloWorld/templates]# pwd
/root/HelloWorld/templates
[root@sige~/HelloWorld/templates]# cat post.html
<html>
<head>
<meta charset="utf-8" />
<title>Search - w3cschool.cc</title>
</head>
<body>
<form action="/search-post/" method="post">
{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Submit">
</form>
<p>{{ rlt }}</p>
</body>
</html>
在模板的末尾,我们增加一个rlt记号,为表格处理结果预留位置。
表格后面还有一个{% csrf_token %}的标签。csrf全称是Cross Site Request Forgery。这是Django提供的防止伪装提交请求的功能。POST方法提交的表格,必须有此标签。
在HelloWorld目录下新建 search2.py 文件并使用 search_post 函数来处理 POST 请求:
[root@sige~/HelloWorld/HelloWorld]# pwd
/root/HelloWorld/HelloWorld
[root@sige~/HelloWorld/HelloWorld]# cat search2.py
# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.core.context_processors import csrf
# 接收POST请求数据
def search_post(request):
ctx ={}
ctx.update(csrf(request))
if request.POST:
ctx['rlt'] = request.POST['q']
return render(request, "post.html", ctx)
urls.py 规则修改为如下形式:
[root@sige~/HelloWorld/HelloWorld]# cat urls.py
from django.conf.urls import *
from HelloWorld.view import hello
from HelloWorld.testdb import testdb
from HelloWorld import search
from HelloWorld import search2
urlpatterns = patterns("",
('^hello/$', hello),
('^testdb/$', testdb),
(r'^search-form/$', search.search_form),
(r'^search/$', search.search),
(r'^search-post/$', search2.search_post),
)
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
浏览器访问 http://192.168.1.136:8000/search-post/ 显示结果有变化啦。
完成以上实例后,我们的目录结构为:
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# tree
HelloWorld
|-- HelloWorld
| |-- __init__.py
| |-- __init__.pyc
| |-- models.pyc
| |-- search.py
| |-- search.pyc
| |-- search2.py
| |-- search2.pyc
| |-- settings.py
| |-- settings.pyc
| |-- testdb.py
| |-- testdb.pyc
| |-- urls.py
| |-- urls.pyc
| |-- view.py
| |-- view.pyc
| |-- wsgi.py
| `-- wsgi.pyc
|-- TestModel
| |-- __init__.py
| |-- __init__.pyc
| |-- admin.py
| |-- models.py
| |-- models.pyc
| |-- tests.py
| `-- views.py
|-- manage.py
`-- templates
|-- base.html
|-- hello.html
|-- post.html
`-- search_form.html
3 directories, 29 files
接下来就是Django Admin管理工具的建立的,很激动呀!!!
[root@sige~/HelloWorld/HelloWorld]# pwd
/root/HelloWorld/HelloWorld
[root@sige~/HelloWorld/HelloWorld]# cat settings.py
INSTALLED_APPS = (
'django.contrib.admin', ###这个就是管理工具啦!!!
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel',
)
通常我们在生成项目时会在urls.py中自动设置好,我们只需去掉注释即可。
配置项如下所示:
[root@sige~/HelloWorld/HelloWorld]# cat urls.py
from django.conf.urls import *
from HelloWorld.view import hello
from HelloWorld.testdb import testdb
from HelloWorld import search
from HelloWorld import search2
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns("",
('^hello/$', hello),
('^testdb/$', testdb),
(r'^search-form/$', search.search_form),
(r'^search/$', search.search),
(r'^search-post/$', search2.search_post),
(r'^admin/', include(admin.site.urls)),
)
启动开发服务器,然后在浏览器中访问:http://192.168.1.136:8000/admin/就可以访问django的管理界面啦!!!
你可以通过命令 python manage.py createsuperuser 来创建超级用户,这个之前已经创建好的就不需要创建了。这个就是登陆admin的用户名和密码。
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
浏览器访问 http://192.168.1.136:8000/admin/ 显示结果有变化啦。
为了让admin界面管理某个数据模型,我们需要先注册该数据模型到admin。比如,我们之前在 TestModel 中已经创建了模型 Test 。修改 TestModel/admin.py:
[root@sige~/HelloWorld/TestModel]# pwd
/root/HelloWorld/TestModel
[root@sige~/HelloWorld/TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test
# Register your models here.
admin.site.register(Test)
刷新后即可看到 Testmodel 数据表:
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
浏览器访问 http://192.168.1.136:8000/admin/ 显示结果有变化啦。
管理页面的功能强大,完全有能力处理更加复杂的数据模型。
先在 TestModel/models.py 中增加一个更复杂的数据模型:
[root@sige~/HelloWorld/TestModel]# pwd
/root/HelloWorld/TestModel
[root@sige~/HelloWorld/TestModel]# cat models.py
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20)
# Create your models here.
class Contact(models.Model):
name = models.CharField(max_length=200)
age = models.IntegerField(default=0)
email = models.EmailField()
def __unicode__(self):
return self.name
class Tag(models.Model):
contact = models.ForeignKey(Contact)
name = models.CharField(max_length=50)
def __unicode__(self):
return self.name
这里有两个表。Tag以Contact为外部键。一个Contact可以对应多个Tag。
我们还可以看到许多在之前没有见过的属性类型,比如IntegerField用于存储整数。
在 TestModel/admin.py 注册多个模型并显示:
[root@sige~/HelloWorld/TestModel]# pwd
/root/HelloWorld/TestModel
[root@sige~/HelloWorld/TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag
# Register your models here.
admin.site.register([Test, Contact, Tag])
刷新管理页面,显示结果就变了:
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
浏览器访问 http://192.168.1.136:8000/admin/ 显示结果有变化啦。
我们可以自定义管理页面,来取代默认的页面。比如上面的"add"页面。我们想只显示name和email部分。修改 TestModel/admin.py:
[root@sige~/HelloWorld/TestModel]# pwd
/root/HelloWorld/TestModel
[root@sige~/HelloWorld/TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag
# Register your models here.
class ContactAdmin(admin.ModelAdmin):
fields = ('name', 'email')
admin.site.register(Contact, ContactAdmin)
admin.site.register([Test, Tag])
我们还可以将输入栏分块,每个栏也可以定义自己的格式。修改TestModel/admin.py为:
[root@sige~/HelloWorld/TestModel]# pwd
/root/HelloWorld/TestModel
[root@sige~/HelloWorld/TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag
# Register your models here.
class ContactAdmin(admin.ModelAdmin):
fieldsets = (
['Main',{
'fields':('name','email'),
}],
['Advance',{
'classes': ('collapse',), # CSS
'fields': ('age',),
}]
)
admin.site.register(Contact, ContactAdmin)
admin.site.register([Test, Tag])
上面的Contact是Tag的外部键,所以有外部参考的关系。
而在默认的页面显示中,将两者分离开来,无法体现出两者的从属关系。我们可以使用内联显示,让Tag附加在Contact的编辑页面上显示。
修改TestModel/admin.py:
[root@sige~/HelloWorld/TestModel]# pwd
/root/HelloWorld/TestModel
[root@sige~/HelloWorld/TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag
# Register your models here.
class TagInline(admin.TabularInline):
model = Tag
class ContactAdmin(admin.ModelAdmin):
inlines = [TagInline] # Inline
fieldsets = (
['Main',{
'fields':('name','email'),
}],
['Advance',{
'classes': ('collapse',),
'fields': ('age',),
}]
)
admin.site.register(Contact, ContactAdmin)
admin.site.register([Test])
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
浏览器访问 http://192.168.1.136:8000/admin/ 显示结果有变化啦。
我们也可以自定义该页面的显示,比如在列表中显示更多的栏目,只需要在ContactAdmin中增加list_display属性:
[root@sige~/HelloWorld/TestModel]# pwd
/root/HelloWorld/TestModel
[root@sige~/HelloWorld/TestModel]# cat admin.py
from django.contrib import admin
from TestModel.models import Test,Contact,Tag
# Register your models here.
class ContactAdmin(admin.ModelAdmin):
list_display = ('name','age', 'email') # list
admin.site.register(Contact, ContactAdmin)
admin.site.register([Test, Tag])
搜索功能在管理大量记录时非常有,我们可以使用search_fields为该列表页增加搜索栏:
[root@sige~/HelloWorld/TestModel]# pwd
/root/HelloWorld/TestModel
[root@sige~/HelloWorld/TestModel]# cat admin.py
from django.contrib import admin
#from TestModel.models import Test
from TestModel.models import Test,Contact,Tag
# Register your models here.
#admin.site.register(Test)
#admin.site.register([Test, Contact, Tag])
#class TagInline(admin.TabularInline):
# model = Tag
class ContactAdmin(admin.ModelAdmin):
# inlines = [TagInline] # Inline
# fieldsets = (
# ['Main',{
# 'fields':('name','email'),
# }],
# ['Advance',{
# 'classes': ('collapse',), # CSS
# 'fields': ('age',),
# }]
# )
list_display = ('name','age', 'email') # list
search_fields = ('name',)
admin.site.register(Contact, ContactAdmin)
#admin.site.register([Test, Tag])
admin.site.register([Test])
[root@sige~/HelloWorld]# pwd
/root/HelloWorld
[root@sige~/HelloWorld]# python manage.py runserver 0.0.0.0:8000
浏览器访问 http://192.168.1.136:8000/admin/ 显示结果又有变化啦。
本文出自 “Linux运维之道” 博客,谢绝转载!