安裝環境:html
uname -r python
14.04.1-Ubuntu x86_64 x86_64 x86_64 GNU/Linuxmysql
ubuntu自帶python 2.7.6sql
https://www.djangoproject.com/download/下載數據庫
django-1.6.11.tar.gzdjango
配置ubuntu機器基本環境ubuntu
root@sige-virtual-machine:~# cat /etc/network/interfacesvim
# interfaces(5) file used by ifup(8) and ifdown(8)瀏覽器
auto lobash
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/ 顯示結果又有變化啦。