學習Django的這幾天,學習過程還是很愉快的,django採用的MVC架構,學習曲線十分平緩,在深入學習之前,先簡單的整理記錄下django從數據庫中獲取數據並在模板中使用的方法。溫故而知新 ^_^
首先假設一個簡單的場景,數據庫中存放着作者和書目的信息。這是一種多對多(ManyToMany)的結構,因爲一個作者可以寫多本書,一本書也可能由多個作者共同完成。我們如何使用Django來創建項目,配置數據庫,創建視圖,模板,配置URL路由,最後在瀏覽器訪問我們動態創建的頁面、
如下的部分算作是記錄,也會簡單的說明下Django的工作原理。入果是新手,估計看看也會有所收穫,能對Django有個大概的瞭解。想系統的學習Django的小夥伴推薦你看《Django Book(中文版)》,這個文檔有些年頭,不過最近學習來看,原理和基本操作都沒變,就是目錄結構隨着版本的升級發生變化,沒啥大的影響,如英語可以,看Django官方文檔當然是最好的。
假設你已經配置好了Django的環境。那麼使用如下命令,創建我們的項目:
django-admin.py startproject project
cd project
python mamages.py startapp blog
這樣我們就創建完成一個基本的項目了。來tree一下看看:
[root@Init-smile project]# tree
顯示結果:
.
├── blog
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── project
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
3 directories, 11 files
需要修改的文件是settings.py,在裏面註冊我們新建的APP,並且配置mysql數據庫。找到
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog' )
添加APP,按如下的事例配置數據庫,NAME,USER,PASSWORD換成你的。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'NAME': 'AuthBooks', 'USER': 'root', 'PASSWORD': '123456', } }
接下來,配置URL路由,修改urls.py,這個的作用就是匹配網址,提交給views.py進行處理
from django.conf.urls import patterns, include, url from django.contrib import admin urlpatterns = patterns('', # Examples: # url(r'^$', 'project.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^author/$', 'blog.views.show_author'), url(r'^book/$', 'blog.views.show_book'), )
這樣,我們的網址如127.0.0.1/author和127.0.0.1/book就會對應進入不同的處理函數來對他們進行處理,接下來我們就編寫views.py,實現相應功能。等等,在這之前,我們必須先了解下數據庫,瞭解下如何建立數據,初始化表,獲取數據。這樣我們才能繼續進行。在models.py模塊中來定義我們的表如下,有Author,Book表,Author保存着作者名,Book保存着書名和作者名
from django.db import models # Create your models here. class Author(models.Model): name = models.CharField(max_length=30) def __unicode__(self): return self.name class Book(models.Model): name = models.CharField(max_length=30) authors = models.ManyToManyField(Author) def __unicode__(self): return self.name
接下來,我們要初始化數據庫。使用如下命令。
python manage.py syncdb
Operations to perform:
Apply all migrations: admin, contenttypes, auth, sessions
Running migrations:
Applying contenttypes.0001_initial… OK
Applying auth.0001_initial… OK
Applying admin.0001_initial… OK
Applying sessions.0001_initial… OK
You have installed Django’s auth system, and don’t have any superusers defined.
Would you like to create one now? (yes/no):
這裏問我們是不是建立一個管理賬戶。我們選擇Yes,然後根據提示創建完成。去項目根目錄看看是不是有一個名爲db.sqlite3的數據庫了~
接下來,我們通過項目提供的shell練習一下添加作者,書籍等數據。然後再到views.py模塊中進行處理。
python manage.py shell
這樣,我們就進入了一個django爲我們配置好的shell環境,我們可以方便的導入相關的模塊而不必擔心not found問題。
接下來運行如下一系列命令。來爲數據庫添加記錄
from blog.models import Author, Book
Author.objects.create(name='sin')
Author.objects.create(name='sun')
Author.objects.create(name='lin')
b1 = Book()
b1.name = 'book1'
b1.save()
b2 = Book()
b2.name = 'book2'
b2.save()
b3 = Book()
b3.name = 'book3'
b3.save()
sin = Author.objects.get(name__exact='sin')
sun = Author.objects.get(name__exact='sun')
lin = Author.objects.get(name__exact='lin')
b1.authors.add(sin)
b1.authors.add(sun)
b2.authors.add(sun)
b3.authors.add(sun)
b3.authors.add(lin)
根據上面的命令就可以建立起如下圖所示的Authors-Books對應關係
補充一些常用命令
(根據書本查作者)
查詢每本書對應的作者:
>>> b1.authors.all() [<Author: sin>, <Author: sun>] >>> b2.authors.all() [<Author: sun>] >>> b3.authors.all() [<Author: sun>, <Author: lin>]
查詢書中的指定作者看是否存在
b1.authors.filter(name__exact='sin')
刪除書的作者:
b1.authors.remove(sun)
(根據作者查詢他出的書)
>>> sin.book_set.all() [<Book: book1>] >>> sun.book_set.all() [<Book: book1>, <Book: book2>, <Book: book3>] >>> lin.book_set.all() [<Book: book3>]
事實上,book_set相當於前面使用的objects
>>> sin.book_set.add(b3) >>> sin.book_set.remove(b3) >>> sin.book_set.all() [<Book: book1>]
爲作者添加新的書目:
sin.book_set.create(name='book4')
如上的命令都是封裝好的數據庫操作指令,所做的所有改動都會保存在數據庫中。下面,就可以進行view.py的配置,和模板的編寫,來在html上直觀的顯示出作者和書目的對應關係
view.py內容如下,它就是用來處理對應的URL都做什麼,在這裏是返回處理過的模板
from django.shortcuts import render_to_response from blog.models import Author, Book # Create your views here. def show_author(request): authors = Author.objects.all() return render_to_response('show_author.html', {'authors':authors}) def show_book(request): books = Book.objects.all() return render_to_response('show_book.html', {'books':books})
在blog的目錄下新建templates文件夾,這是系統默認的模板搜索路徑,所以直接在裏面新建show_author.html 內容如下:
{% for author in authors %} <div> <h3>{{ author.name }}</h3> {% for book in author.book_set.all %} <li>{{ book.name }}</li> {% endfor %} </div> {% endfor %}
再建立show_book.html,內容如下:
{% for book in books %} <h3>{{ book.name }}</h3> <div> {% for author in book.authors.all %} <li>{{ author.name }}</li> {% endfor %} </div> {% endfor %}
OK,如上就是構建django項目創建APP,配置數據庫,添加數據,配置URL路由,編寫視圖,模板的所有內容了。
下面來運行我們的項目,並在瀏覽器端訪問。
在project目錄下運行:
python manage.py runserver
這樣,你在本地通過127.0.0.1:8000/author和127.0.0.1:8000/book就可以看到效果了
如果你使用的虛擬機(橋接上網),那麼可以使用如下命令
python manage.py runserver 0.0.0.0:80
如上就可以通過你的虛擬機IP地址進行訪問了。(你可能需要使用iptables -F來臨時關閉iptables)
好的,看看是不是和我的運行的結果一樣呢~