(一)關於Django
Django是一個基於MVC構造的架構。但是在Django中,控制器接受使用者輸入的部分由架構自行處理,所以 Django 裡更關注的是模型(Model)、模板(Template)和視圖(Views),稱為 MTV模式。
Ubuntu下的安裝:一般都內建Python的。網上教程比較多了....
dizzy@dizzy-pc:~$ pythonPython 2.7.3 (default, Apr 20 2012, 22:44:07) [GCC 4.6.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import django>>> help(django)VERSION = (1, 6, 4, 'final', 0)#可以查看django版本等資訊。
(二)第一個Django的app
#環境:Python2.7,Django1.6,Ubuntu12.04
Python 及 Django 安裝成功之後,就可以建立Django工程了
(1)教你開始寫Django1.6的第1個app
#先建立一個檔案夾dizzy@dizzy-pc:~$ mkdir Pythondizzy@dizzy-pc:~$ cd Python#然後建立工程dizzy@dizzy-pc:~/Python$ django-admin.py startproject mysitedizzy@dizzy-pc:~/Python$ cd mysite#然後這個工程就可以啟動服務了dizzy@dizzy-pc:~/Python/mysite$ python manage.py runserverValidating models... 0 errors foundJuly 23, 2014 - 14:17:29Django version 1.6.4, using settings 'mysite.settings'Starting development server at http://127.0.0.1:8000/Quit the server with CONTROL-C.#這樣,開啟瀏覽器訪問: 便可看到: It Worked! 關閉服務:ctrl+c #新建立的項目裡面會有:manage.py檔案,mysite檔案夾#在mysite檔案夾裡面會有:__init__.py,settings.py,urls.py,wsgi.py四個檔案 #__init__.py是一個空檔案,#setting.py 是項目的設定檔。需要修改兩個地方,這裡使用預設的SQLite3資料庫LANGUAGE_CODE = 'zh-cn' #原:en-usTIME_ZONE = 'Asia/Shanghai' #原:UTC #配置完之後,便可以建立資料表了dizzy@dizzy-pc:~/Python/mysite$ python manage.py syncdb#建立是還要設定一個超級管理員,用於後台登入。#設定完之後,開啟服務,便可進入後台管理介面了:http://127.0.0.1:8000/admin/
(2)教你開始寫Django1.6的第1個app
#建立一個用於投票的app。#進入mysite工程根目錄,建立appdizzy@dizzy-pc:~/Python/mysite$ python manage.py startapp pollsdizzy@dizzy-pc:~/Python/mysite$ ls pollsadmin.py __init__.py models.py urls.py views.py #這樣。Django已經產生了,app通常所需的模板檔案。
下面建立兩個models。Poll 和 Choice
dizzy@dizzy-pc:~/Python/mysite$ vim polls/models.py
修改檔案如下:
from django.db import models # Create your models here. from django.db import models class Poll(models.Model): question = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): poll = models.ForeignKey(Poll) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)#基本建立model過程就是這樣,細節還要深入研究!
然後修改工程的設定檔setting.py,在INSTALLED_APP元組下面添加剛才建立的app:polls
dizzy@dizzy-pc:~/Python/mysite$ vim mysite/settings.py INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'polls',) #可以使用 python manage.py sql polls 查看app的建表SQL#使用 python manage.py syncdb 進行建立資料庫表dizzy@dizzy-pc:~/Python/mysite$ ./manage.py sql pollsBEGIN;CREATE TABLE "polls_poll" ( "id" integer NOT NULL PRIMARY KEY, "question" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);CREATE TABLE "polls_choice" ( "id" integer NOT NULL PRIMARY KEY, "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"), "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL); COMMIT; #這樣就可以通過設定model讓Django自動建立資料庫表了 要想在後台admin中管理polls。還需要修改app下面的admin.py 檔案。from django.contrib import admin # Register your models here. from django.contrib import adminfrom polls.models import Choice,Poll class ChoiceInLine(admin.StackedInline): model = Choice extra = 3 class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields':['question']}), ('Date information', {'fields':['pub_date'],'classes':['collapse']}), ] inlines = [ChoiceInLine] admin.site.register(Poll,PollAdmin) #這部分代碼,大體能看懂,具體的規則還要稍後的仔細研究。##這部分代碼,由於拼字失誤,導致多處出錯。細節決定成敗!!
這樣再重啟服務,就能在後台管理polls應用了。
(3)視圖和控制器部分
前面已經完成了model(M)的設定。剩下的只有view(V)和urls(C)了。Django的視圖部分,由views.py 和 templates完成。
在polls中,我們將建立4個視圖:
- “index” 列表頁 – 顯示最新投票。
- “detail” 投票頁 – 顯示一個投票的問題, 以及使用者可用於投票的表單。
- “results” 結果頁 – 顯示一個投票的結果。
- 投票處理 – 對使用者提交一個投票表單後的處理。
現在修改 views.py 建立用於視圖的函數。
dizzy@dizzy-pc:~/Python/mysite$ vim polls/views.py
from django.shortcuts import render,get_object_or_404 # Create your views here.from django.http import HttpResponsefrom polls.models import Poll def index(request): latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] context = {'latest_poll_list':latest_poll_list} return render(request,'polls/index.html',context) def detail(request,poll_id): poll = get_object_or_404(Poll,pk=poll_id) return render(request,'polls/detail.html',{'poll':poll}) def results(request,poll_id): return HttpResponse("you're looking at the results of poll %s." % poll_id) def vote(request,poll_id): return HttpResponse("you're voting on poll %s." % poll_id) #涉及Django的內建函數,不做深究。後面再做研究!
要想使試圖能被訪問,還要配置 urls.py 。mysite是整個網站的URLConf,但每個app可以有自己的URLConf,通過include的方式匯入到根配置中即可。現在在polls下面建立 urls.py
from django.conf.urls import patterns,url from polls import views urlpatterns = patterns('', #ex:/polls/ url(r'^$',views.index,name='index'), #ex:/polls/5/ url(r'^(?P\d+)/$',views.detail,name='detail'), #ex:/polls/5/results/ url(r'^(?P\d+)/results/$',views.results,name='results'), #ex:/polls/5/vote/ url(r'^(?P\d+)/vote/$',views.vote,name='vote'),)#url中,三個參數。正則的url,處理的函數,以及名稱#Regex!!!!!
然後在根 urls.py 檔案中,include這個檔案即可。
dizzy@dizzy-pc:~/Python/mysite$ vim mysite/urls.py
from django.conf.urls import patterns, include, url from django.contrib import adminadmin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'mysite.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^polls/', include('polls.urls',namespace="polls")), url(r'^admin/', include(admin.site.urls)),)#有Example:兩種形式。因為是元組,所以開始有“ ‘', ”。
然後開始建立模板檔案。在polls下,建立templates檔案夾。下面有index.html, detail.html 兩個檔案。
{% if latest_poll_list %}
{% for poll in latest_poll_list %}
- {{ poll.question }}
{% endfor %}
{% else %}
No polls are available.
{% endif %}
{{ poll.question }}
{% for choice in poll.choice_set.all %}
- {{ choice.choice_text }}
{% endfor %}
(4)投票功能完善
上面只是簡單的實現了視圖功能,並沒有真正的實現投票功能。接下來就是完善功能。
#修改模板檔案dizzy@dizzy-pc:~/Python/mysite$ vim polls/templates/polls/detail.html#需要加入form表單{{ poll.question }}
{% if error_message %}{{ error_message }}
{% endif %}
然後需要修改 views.py 中的 vote 處理函數。進行post資料的接收與處理。
# 檔案 polls/views.py from django.shortcuts import get_object_or_404, renderfrom django.http import HttpResponseRedirect, HttpResponsefrom django.core.urlresolvers import reversefrom polls.models import Choice, Poll# ...def vote(request, poll_id): p = get_object_or_404(Poll, pk=poll_id) try: selected_choice = p.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): # Redisplay the poll voting form. return render(request, 'polls/detail.html', { 'poll': p, 'error_message': "You didn't select a choice.", }) else: selected_choice.votes += 1 selected_choice.save() # Always return an HttpResponseRedirect after successfully dealing # with POST data. This prevents data from being posted twice if a # user hits the Back button. return HttpResponseRedirect(reverse('polls:results', args=(p.id,)))
在投票成功之後,讓使用者瀏覽器重新導向到結果 results.html 頁。
def results(request, poll_id): poll = get_object_or_404(Poll, pk=poll_id) return render(request, 'polls/results.html', {'poll': poll})
然後就需要建立模板 results.html 。
{{ poll.question }}
{% for choice in poll.choice_set.all %}
- {{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}
{% endfor %}
Vote again?
至此,重啟服務就能看到選項按鈕,以及submit了。