民意调查Django实现(一)
經過兩天的python2.7的學習和Django的基礎部分的了解,在Django的官網上,我看到了一個實例程序,該實例程序是通過一個基本民意調查程序的完成來深入理解Django框架。
該民意調查有兩個部分:
- 一個用于用戶查看民意調查問卷并且投票網頁
- 一個管理端用于你去添加,修改和刪除民意調查項
在之前的博客中,我已經明確的說明了Django的安裝和使用。同時也說明了如何使用python函數來查看Django的版本號。在這里,我使用的是Django 1.7。
我的python版本使用的是python2.7.9,在上面的圖片中也顯示的很透明了。
創建一個項目
首先需要說明的是,我會在我的目錄~/Documents/Polls/ 下面創建我的Django項目。
在我們使用Django的腳本創建項目的時候,就會自動生成一個帶有原始代碼的項目,這個項目是Django一些設置的集合,其中包括數據庫配置,Django特有選項和應用特有的設置。
下面創建我們的新項目:
首先我需要切換到我要保存代碼的目錄:
cd ~/Documents/current/Polls django-admin startproject mysitedjango-admin命令將會在你的當前目錄下創建一個項目。
下面我們來看一下創建的項目的目錄。
這些文件是:
- 外部的mysite是剛剛我們創建的項目的名稱,同時也是我們項目的容器??梢噪S意命名
- manage.py : 該腳本提供了多種使你和Django項目交互的方法。
- 內部的mysite目錄是你項目的真實的Python包。他的名字是Python的包名,你在它內部來導入你需要的東西
- mysite/init.py:一個空文件,該文件告訴Python這個目錄是一個Python包
- mysite/settings.py:該Django項目的設置/配置文件。
- mysite/urls.py:該Django項目的URL聲明;
- mysite/wsgi.py:ASGI web服務器的入口,在部署你的Django項目的時候會了解到。
數據庫安裝
現在,打開,mysite/settings.py文件。他是一個代表Django設置的Python模塊。
在默認情況下,配置使用的是SQLite數據庫。SQLite是內置在Python中的,所以如果你要使用SQLite的話,無需安裝其他任何東西。如果你想要使用其他數據錄,需要去安裝合適的數據庫綁定,并且修改下面的語句來使用你的數據庫連接設置。
在默認情況下,我們的settings.py文件中的有關數據庫的配置是這樣的:
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db.sqlite3'),} }由于我們現在使用的是mysql,所以,我們需要把這個地方修改一下,改成這樣的:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'db_polls','USER':'root','PASSWORD':'0504zhao,','HOST':'','PORT':'',} }其中,default下面的各個選項的意思為:
- ENGINE: 代表我們使用的數據庫引擎,其中常用的有’django.db.backends.sqlites3’,’django.db.backends.postgresql_psycopg2’,’django.db.backends.mysql’,’django.db.backends.oracle’。當然,他也支持其他數據庫。
- NAME: 你所使用的數據庫的名稱。如果你使用的是SQLite的話,數據庫應該是你計算機上的一個文件,這樣的話,NAME就應該是文件的全路徑。
- USER: 連接數據庫所使用的用戶名
- PASSWORD: 連接數據庫所使用的密碼
- HOST: 數據庫所在的主機地址
- PORT: 數據庫所占有的端口
接著編輯我們的mysite/settings.py文件,講其中的TIME_ZONE設置成我們中國的時區’Asia/Shanghai’。
TIME_ZONE = 'Asia/Shanghai'注意位于setting.py上面的INSTALLED_APPS設置。他承載這在Django實例中被激活的應用的名稱。App可以用到多個項目中,你可以打包和發布他們被別人的項目使用。
在默認情況下,INSTALL_APPS包含下面的app,所有的這些都來自Django.
- django.contrib.admin - admin站點。在后面會用到
- django.contrib.auth - 一個驗證系統
- django.contrib.contenttypes - 用于內容類型的框架
- django.contrib.sessions - 一個session框架
- django.contrib.messages - 一個信息框架
- django.contrib.staticfiles - 管理靜態文件的框架
這些應用都是被默認包含的用于常用功能。
這些應用中有些至少使用一個數據庫表,所以,我們在我們使用他們之前,我們需要在數據庫中創建表格。我們需要運行下面的命令來實現:
# 在項目工程下 python manage.py migrate下面我們來執行一下這個命令:
migrate會查看INSTALLED_APPbiaogeS設置來創建必要的數據庫表。我們連接我們的mysql數據庫看一下都生成了哪些表格。
+----------------------------+ | Tables_in_db_polls | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | +----------------------------+這都是生成的和app相關的數據庫表格。
開發服務器
下面我們來驗證一下我們的Django項目是否成功運行。切換到我們的項目根目錄下,運行下面的命令:
python manage.py runserver我們將會看到命令行下會有這樣的輸出:
我們可以看到,在上面的輸出中,已經告訴我們如何去打開我們的網站。在瀏覽器中輸入下面的網址:
https://127.0.0.1:8000如果成功運行,則網頁會打開下面的內容:
但是有一個需要說明的是,如果你要部署該項目,不能使用開發服務器,因為他僅僅用于開發測試使用。
當然,在我們運行服務器的時候,可以指定IP和端口來訪問該網站。 python manage.py runserver 0.0.0.0:9000注意:runserver是會自動重新加載的,當你便攜完成代碼之后,無需重新運行該服務器。創建模板
你的app可以在你的Python項目的任何位置。在這里,我們創建一個app和manage,py在一個目錄下,所以,他可以被引入作為頂層模塊而不是mysite的一個子模塊。
我們使用下面的命令來創建一個模塊,名字叫做polls。
python manage.py startapp polls創建完成polls之后,我們看一下我們項目的目錄列表。
. ├── manage.py ├── mysite │ ├── __init__.py │ ├── __init__.pyc │ ├── settings.py │ ├── settings.pyc │ ├── urls.py │ ├── urls.pyc │ ├── wsgi.py │ └── wsgi.pyc └── polls├── admin.py├── __init__.py├── migrations│ └── __init__.py├── models.py├── tests.py└── views.py3 directories, 15 files這個目錄結構會支持一個民意調查應用.
我們開始的第一步就是在你的Django中編寫一個數據庫Web app來定義你的模塊 - 也就是你的數據庫布局,帶有傳統的元數據。
一個模型是你的數據的真實的單一的,傳統的源碼。他包含必要的域和你要存儲的數據的行為。Django遵循DRY規則。目標就是在一個地方定義你的數據模型并且自動從他那里導出字符串。在我們實例項目中,我們創建兩個模型:Question和Choice。Question擁有一個question域和一個發布時間域。Choice有兩個域:選項的文本和一個總的投票結果。每一個Choice都和一個Question相連。
這些概念都是通過簡單的Python類來實現的。編輯polls/models.py文件。
from django.db import models class Question(models.Model):question_text = models.CharField(max_length = 20)pub_date = models.DateTimeField('date published')class Choice(models.Model):question = models.ForeignKey(Question)choice_text = models.CharField(max_length = 200)votes = models.IntegerField(default=0)上面的代碼是非常直接的。每一個模型都是’django.db.models.Model’的子類。每一個模型都有一些類變量,每一個變量都代表這在模型中的一個數據庫表域。
每一個域都是由Field類的一個實例代表的–例如CharField 用于字符域和DateTimeField用于日期時間。這告訴Django每一個域是什么樣的數據類型。
每一個Field實例的名字就是域的名稱(例如question_text或者是pub_date)。你可以在你的Python代碼中使用這些值,你的數據庫將會使用他們作為列名稱。
每一個Field類可能需要有多個參數。
最后,注意關系的定義,使用ForeignKey。那告訴Django每一個Choice是和一個單一的Question相關的。Django支持所有通用的數據庫關系:多對一,多對多和一對一。
激活模型
剛剛那一小段代碼給了Django很多信息,使用它,Django能夠:
- 為這個app創建一個表格(CREATE TABLE statements)
- 創建一個用于訪問Question和Choice對象的Python數據庫訪問API
但是,首先我們需要告訴我們的項目polls app被安裝了。
編輯mysite/settings.py文件,修改INSTALLED_APP設置,最后添加’polls’。就像下面這樣:
INSTALLED_APPS = ('django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','polls', )接著,我們運行下面的命令來通知Django創建相應的表格。
python manage.py makemigrations polls你將會看到下面的輸出:
Migrations for 'polls':0001_initial.py:- Create model Choice - Create model Question - Add field question to choice通過運行makemigrations,你就會告訴Django你對你的模型做了修改(在這里,我們創建了新的模型),這些改變將會被存儲為migration。
Migration是Django如何保存你的模型的改變-他們是在你磁盤上的文件。你可以讀取你的新模型的migration。他是文件polls/mogrations/0001_initail.py。我們來看一下:
# -*- coding: utf-8 -*- from __future__ import unicode_literalsfrom django.db import models, migrations class Migration(migrations.Migration):dependencies = []operations = [migrations.CreateModel(name='Choice',fields=[('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),('choice_text', models.CharField(max_length=200)),('votes', models.IntegerField(default=0)),],options={},bases=(models.Model,),),migrations.CreateModel(name='Question',fields=[('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),('question_text', models.CharField(max_length=20)),('pub_date', models.DateTimeField(verbose_name=b'date published')),],options={},bases=(models.Model,),),migrations.AddField(model_name='choice',name='question',field=models.ForeignKey(to='polls.Question'),preserve_default=True,),]在這里我們可以看出,他自動為我們的每一個數據表生成了一個id鍵值。不要擔心。不必在修改或者是新建模型之后就查看這個文件。他僅僅就是設計來用戶可編輯來做一些人工的改變。
有一個命令能夠運行migrations并且自動管理你的數據表–稱為migrate。一會我們再看這個命令,首先我們看一下migrations將會運行什么樣的SQL語句。我們使用sqlmigrate命令來查看。
python manage.py sqlmigrate polls 0001下面是運行的結果(其實就是一些sql語句的結合):
BEGIN; CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL); CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_text` varchar(20) NOT NULL, `pub_date` datetime NOT NULL); ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer NOT NULL; ALTER TABLE `polls_choice` ALTER COLUMN `question_id` DROP DEFAULT; CREATE INDEX `polls_choice_7aa0f6ee` ON `polls_choice` (`question_id`); ALTER TABLE `polls_choice` ADD CONSTRAINT `polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`);COMMIT;注意下面:
- 真實的輸出依賴于你正在使用的數據庫。我的例子的輸出是mysql的
- 表的名稱自動由app的名稱(polls)和小寫的模塊的名稱(question,choice)聯合生成(你可以重載這個行為)
- 主鍵(IDs)自動被添加(你也可以重載)
- 按照慣例,Django向外鍵域名稱后附加’_id’(你還是可以重載)
- 外鍵關系是明確的FROEIGN KEY限制。
- sqlmigrate命令不會引用這些sql語句,他僅僅是將應用語句打印出來工大家參考
如果你有興趣,可以運行命令python manage.py check,他會檢查在沒有創建數據庫的時候的有關你項目的所有的問題。
現在運行migrate命令來創建相應的模型數據表。
$ python manage.py migrate Operations to perform:Apply all migrations: admin, contenttypes, polls, auth, sessions Running migrations:Applying polls.0001_initial... OKMigrations是非常強大的,他能夠使你在任何時候修改你的模型,而不必刪除原來的數據庫和表重新構建。他支持更新你的數據庫而不會丟失數據。在后面的實踐中我們再詳細介紹,在這里,只需要記住三個步驟:
- 修改你的模型(在models.py中)
- 運行python manage.py makemigrations來創建這些改變的migrations
- 運行python manage.py migrate向數據庫中應用這些改變
玩轉API
現在,我們進入交互式Python shell然后嘗試使用一個Django給予的API。我們使用下面的命令激活Python shell.
python manage.py shell我們使用這個命令而不直接使用”python”,因為manage.py設置DJANGO_SETTINGS_MODULE環境變量,這個變量給予Django Python的導入路徑到你的mysite/setting.py文件中。
如果你不使用manage.py,也沒有問題,那么只需要你手動的設置DJANGO_SETTINGS_MODULE環境變量到mysite.settings中,就是這樣:python import django django.setup()不過這個setup()方法只有Django1.8版本才能使用。當我們進入shell的時候,探索一下數據錄API
>>> from polls.models import Question, Choice # 導入我們剛剛編寫的模塊類# 在系統中還沒有Question實例 >>> Question.objects.all() []# 創建一個新的Question # 在默認設置文件中是支持time zone的 # Django希望pub_date是當前時間,所以使用timezone.now() >>> from django.utils import timezone >>> q = Question(question_text="What's new?", pub_date=timezone.now())# 保存對象到數據庫中。你必須顯示的調用save()函數 >>> q.save()# 現在他有了一個ID。注意,這個可能是"1L"而不是"1" >>> q.id 1# 通過Python屬性訪問模型域值 >>> q.question_text "What's new?" >>> q.pub_date datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)# 通過屬性修改值,然后調用save() >>> q.question_text = "What's up?" >>> q.save()# objects.all()顯示在數據庫中所有的問題 >>> Question.objects.all() [<Question: Question object>]等一下,對于我們來說是沒用的。我們通過編輯Question模型(位于polls/model.py文件中)來完善它,并且向Question和Choice中各添加一個unicode()函數。
from django.db import modelsclass Question(models.Model):question_text = models.CharField(max_length = 20)pub_date = models.DateTimeField('date published')def __unicode__(self): # 在python3中是 __str__()return self.question_textclass Choice(models.Model):question = models.ForeignKey(Question)choice_text = models.CharField(max_length = 200)votes = models.IntegerField(default=0)def __unicode__(self): # 在python3中是 __str__()return self.choice_text這樣完成之后,我們退出剛剛的shell,重新進入:
>>> from polls.models import Question,Choice >>> Question.objects.all() [<Question: What's up?>]這樣顯示的就不是object了,顯示的就是Question的名稱了。所以,推薦大家以后在編寫models模塊的時候,新建類的時候盡量加上這個函數。
這一小節就到這里了,后面我們會接著進行學習。
注意:我的代碼已經上傳到我的github:
下載源碼
轉載于:https://www.cnblogs.com/bobo1223/p/7287489.html
總結
以上是生活随笔為你收集整理的民意调查Django实现(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7环境下创建超级隐藏账户
- 下一篇: urllib.error.HTTPErr