語言djangoDjango你需要知道的所有信息_第1頁
語言djangoDjango你需要知道的所有信息_第2頁
語言djangoDjango你需要知道的所有信息_第3頁
語言djangoDjango你需要知道的所有信息_第4頁
語言djangoDjango你需要知道的所有信息_第5頁
已閱讀5頁,還剩1082頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

一、Django基礎(chǔ)Django從零開始 概覽(100%) 安裝 1(100%)|第2(100%)|第3模板(100%)|4(100%)|5(100%)|高級:如何編寫可重用的應(yīng)用(100%)|為Django編寫首個補丁模型層(Models模型 模型語法 |字段類型 |元選項(100%)|模型查詢集:執(zhí)行查詢 查詢集API參考(20%) 查找表達式模型的實例:實例方法(100%)|遷移 遷移簡介 操作參 模式編輯器 編寫遷移高級:管理器(100%) 原始的SQL查詢(100%) 事務(wù)(100%) 聚合(100%)|定義字段|多數(shù)據(jù)庫(100%)|自定義查找(100%)|查詢表達式|條件表達式 |數(shù)據(jù)庫函數(shù) 支持的數(shù)據(jù)庫(100%)|遺留的數(shù)據(jù)庫(100%)|提供初始數(shù)據(jù)(100%)|優(yōu)化數(shù)據(jù)庫(100%)|PostgreSQLspecificfeatures視圖層基礎(chǔ) URL配置 |視圖函數(shù)(100%)|快捷函數(shù)(100%) 裝飾器參考 內(nèi)建的視圖(100%)| 對象 對(50%) TemteResponse對象文件上傳 概覽 File對象(100%)| 管理文 |自定義基于類的視圖:概覽(100%)|內(nèi)建顯示視圖(100%)|內(nèi)建編輯視圖(100%)|Mixin(60%) API(100%)|分類索引高級 生成 生成中間件:概覽(100%)|模板層基礎(chǔ) 概面向設(shè)計師:語言概覽(100%)|內(nèi)建和過濾器|網(wǎng)頁設(shè)計助手(已廢棄)|面向程序員:模板API(100%)|自定義和過濾器基礎(chǔ) 概覽(100%) 表單 |內(nèi)建的字段(60%)|內(nèi)建的Widget高級 模型表單(50%) 整合(100%) 表單集|自定義驗證開發(fā)流程設(shè)置 概覽 完整列表設(shè)應(yīng)用 概異常 概覽djaadmin和many概覽|添加自定義令測試 介紹 編寫并運試|包含的測試工具|高級部署:概述(100%) WSGI服務(wù)器(100%) FastCGI/SCGI/AJP(已廢棄) 態(tài)文件 Admin界面DjangoAdminAdmin站點管理文檔安全概述點擊劫持保護加密簽名安全中間件 概述 | 本地 PerformanceandThereareavarietyoftechniquesandtoolsthatcanhelpgetyourcoderunningmoreefficiently-faster,andusingfewersystemresources.PerformanceandoptimizationPythoncompDjangoaimstobecompatiblewithmultipledifferentflavorsandversionsofJythonPython3GeographicGeoDjangointendstobeaworld-classgeographicWebframework.ItsgoalistomakeitaseasyaspossibletobuildGISWebapplicationsandharnessthepowerofspatiallyenableddata.常見的應(yīng)用工認證:概覽(100%) 使用認證系統(tǒng)(95%)|管(100%)|自定義認證|日志組織feeds分頁其它功學(xué)習(xí)Django框架的其它功能ContenttypesandgenericrelationsFlatpages"Sites"TheDjangoopen-sourceLearnaboutthedevelopmentprocessfortheDjangoprojectitselfandabouthowyoucancontribute:Community: involved process|organization|Meettheteam|Currentroles|TheDjangosourcecoderepository| Securitypolicies|MailinglistsDesignphil ation:About Thipartydiso Djang time stability| instructions|DeprecationDjango工作變得簡單而快捷。以下簡單介紹了如何用Django編寫一個數(shù)據(jù)庫驅(qū)動的Web應(yīng)用程一個新手指南或參考–其實這些我們都有!當(dāng)你準備新建一個項目,你可以從新手指DjangoPython模式問題。下面是一個簡單的例子fromdjanimpmodelsclassRepo full_name=.=)onPythononPython returnclassArti: pub_date= headline=.=) content= reporter= #returnonPython安裝模塊$pythonmanage.pymig使用方便的P#Importthemodelswecreatedfromour"news"app>>>fromnews.modelsimpoReporter,##Noreportersareinthesystemyet.>>>#CreateanewReporter.>>>r=Reporter(full_name='John#Savetheobjectintothedatabase.Youhavetocallsave()#NowithasanID.>>>

#Nowthenewreporterisinthedatabase.>>>..<John#FieldsarerepresentedasattributesonthePythonobject.>>>#DjangoprovidesarichdatabaselookupAPI.>>>..=:JohnSmith>>>>Reporter.objects.get(full_namestartswith='John')<Reporter:JohnSmith>>>>Reporter.objects.get(full_namecontains='mith')<Reporter:JohnSmith>>>>..=k(mostrecentcalllast): ...DoesNotExist:Reportermatchingquerydoesnot#Createanarticle.>>>fromdatetimeimpdate>>>a=e=.,headline='Djangoiscool',... reporter=r)>>>a.save()#Nowthearticleisinthedatabase.>>>..<:is#ArticleobjectsgetAPIaccesstorelatedReporterobjects.>>>r=.>>>r.full_name'JohnSmith'#Andviceversa:ReporterobjectsgetAPIaccesstoArticle..[<:Djangoisforyoubehindthescenes.#ThisfindsallarticlesbyareporterwhosenamestartsstartswithArticle.objects.filter(reporterfull_namestartswith='John')[<Article:is#Changeanobjectbyalteringitsattributesandcallingsave().>>>='BillyGoat'>>>#Deleteanobjectwithdelete().>>>fromdjanfromdjanimp Artipub_date=.=)content=models.TextField()reporter=fromdjanimprtadminfrom.importmodels這里的設(shè)計理念是你的由一個員工、客戶或者可能是你自己去編輯——而你不想僅僅為了管理內(nèi)容而去創(chuàng)建界面。創(chuàng)建Django應(yīng)用的一個典型工作流程是創(chuàng)建模型然后盡快地讓adminsites啟動和運行起來,這樣您的員工(或客戶)能夠開始錄入數(shù)據(jù)。然后,才開發(fā)展現(xiàn)數(shù)據(jù)給公眾的方式。設(shè)計你的一個干凈、優(yōu)雅的URL方案是高質(zhì)量Web應(yīng)用程序的重要細節(jié) Django鼓勵使用漂亮的設(shè)計且不會像.php或.aspURLs為了給一個應(yīng)用設(shè)計URLs,你需要創(chuàng)建一個叫做URLconf的Python模塊。這其實是你應(yīng)用的 它包含URL模式與Python回調(diào)函數(shù)間的一個簡單映射。URLconfs還用作從Python代碼中解耦URLs。下面是針對上面Reporter/Article例子URLconffromdjanimporturlfrom.importviewsurlpatterns=[ url(r'^articles/([0-9]{4})/$', url(r'^articles/([0-9]{4})/([0-9]{2})/$', url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$',式通過圓括號來“捕獲”URLs,DjangoURL(Django殊的404視圖。)整個過程是極快的,因為正則表達式在加載時編譯。一旦有一個正則表達式匹配上了,Django將導(dǎo)入和調(diào)用對應(yīng)的視圖,它其實就是一個簡單的據(jù))——和正則表達式所捕獲到的值。URL“/articles/2005/05/39323/”,Djangonewea0 '05'39323') HttpResponse對象,或拋出一個異常如Http404。剩下的就靠你了。面是上文year_archive的一個視圖例子:fromdjanimportrenderfrom.modimpArticledefyear_archive(request, a_list=Article.objects.filter(pub_date context={'year':year,'article_list': returnrender(request,'news/year_archive.html',news/year_archive.htmlDjangoDjangoDIRS指定一個查找模板的列表。如果這個模板沒有在第一個中,那么它會去查找 讓我們假設(shè)news/year_archive.html {extends"base.html"%}{blotitle%}Articlesfor{{year}}{%endblock%}{forarticleiarticle_list<p>{{article.headline{b{forarticleiarticle_list<p>{{article.headline <p>By{{article.reporter.full_name <p>Published{{article.pub_date|date:"Fj,Y"}}<endfor%}{%endblock%}變量使用兩對大括號包圍。{{ }}表示“輸出article的headline屬性”。但是點符號不僅用于屬性查找。它們還用于字典的鍵值查找、索引查找和函數(shù)調(diào)用。注意{{article.pub_date|date:"Fj,Y"}}使用Unix風(fēng)格的“管道”(“|”字符)。這叫板過濾器,它是過濾變量值的式。在本例中,date過濾器格式化Python的你可以地串聯(lián)使用多個過濾器。你可以編寫自定義的目標過濾器。你可以編寫自定義的模板,在幕后運行自定義的Python代碼。 %}所做的事。表示“首先載入‘base’block,然后使用接下來的(存在于繼 {loadstaticfiles <ti{blotitle%}{%endblock<img{%staticogo.png"%}"alt="Logo"{blocontent%}{%endblock的重新設(shè)計變得非常容易,只需改變一個文件——base模板。經(jīng)利用這一技術(shù)來創(chuàng)造了顯著不同的版本的——只需創(chuàng)建一個新的基礎(chǔ)模板。請注意,如果你喜歡其它模板系統(tǒng),你可以不使用Django的模板系統(tǒng)。 雖然Django的模板系統(tǒng)與Django的模型層集成得特別好,但并沒有強制你使用它。同理,你也可以不使用Django的數(shù)據(jù)庫API。你可以使用其它數(shù)據(jù)庫抽象層,您可以XML文件,你可以從磁盤中文件,或任何你想要的方法去操作數(shù)據(jù)。Django的每個組成部分——模型、視圖和模這僅僅是知RSSAtomfeedsPython很明顯,下一步你應(yīng)該做的是Django、閱讀并加入社區(qū)。Django的問題;按照指南上的介紹,你可以建立一個簡單、小巧的安裝。安裝PythonWeb,DjangoPythonPython2.7、3.2、3.3Jython上的Django查看在Jython上運行Django獲取詳細信息。你可以在 下輸入python來驗證是否已經(jīng)安裝python;你應(yīng)該看到如下類似的信息PythonPython3.3.3(default,Nov262013,[GCC4.8.2]on[GCC4.8.2]onType"help","copyright","credits"or"license"formore刪除舊版本的Djan安裝安裝正式發(fā)布的版本。這對于想要安裝一個穩(wěn)定版本而不介意運行一個稍舊版本這個特性僅適用開發(fā)版Django,且它們在正式版本可能不工作。>>>>>>import若要驗證Django可以被Python識別,可以在s 中輸入python。然后在Python>>>>>>importThat’s安裝完成——現(xiàn)在你可以繼續(xù)學(xué) $python-c"importdjango;modulenameddjango”的錯誤。新的版本。如果你還在使用2.7Python,你將需要按照注釋中的內(nèi)容稍微調(diào)整一下示以及與其他可能會幫助你的Django用戶交流。如果這是你第一次使用Django,你需要完成一些初始化操作。即,你需要自己用代碼來創(chuàng)建DjangoDjangoDjango在命令行(終端)中,cd(例如 $django-adminstartproject這將會在你的當(dāng) 下生成一個mys 。如果它不能正常工作,請查看運行PythonDjangodja與Django自身)或test(與Python內(nèi)建的包)這樣的名稱。 下(例如/var/www)。使用Django,你不需要這么做。 將Python代碼放在你的Web服務(wù)器的根 將你的代碼放置在Web服務(wù)器根 以外的地方,例如/home/mycode。讓我們看一下startproject生成了什么:外層的mys根 僅僅是項目的一個容器。它名對Django無關(guān)緊要;你可以把它重manage.pyDjango項目進行交互。django-adminmanage.pymanage.py Python包的名字(例如mys.mys myssDjangoDjangomysu ”。你可以URL路由器中閱讀到關(guān)于URL的內(nèi)容mysite/wsgi.py:用于你的項目的與WSGI兼容的Web服務(wù)器。 用WSGI進行部署。mys/示Django的配置。默認情況下,該配置使用。如果你是數(shù)據(jù)庫初學(xué)者,或者你僅僅是想要試用一下Django,它是最簡單的選擇。包含在Python中,所以你不需要另外安裝其他任何東西來支持你 'de條目中修改以下的配置以匹配你的數(shù)據(jù)庫連接的設(shè)置 'djan3','djasyg2',ang.db.backends.mysql'或'django.db.bacends.oracle'。其它的也可以支持。NAME–數(shù)據(jù)庫的名稱。如果你使用,數(shù)據(jù)庫將是你計算機上的一個文件;如果是這樣的話,NAME應(yīng)該是這個文件的絕對路徑,包括文件名。默認值是os.. 'db 當(dāng)你的項目使用之外的其他數(shù)據(jù)庫引擎時,就必須添加USER、PASSWORD、HOST等額外的設(shè)置。的細節(jié),請參見DATABASES的參考文檔。注PostgreSQLMySQL,確保到此你已經(jīng)建立好一個數(shù)據(jù)庫??梢栽谀愕臄?shù)據(jù)庫的交互式提示命令下,使用“CREATEDATABASEdatabase_name;”創(chuàng)建它。myssINSLDjango默認情況下INSLDjangodjac ——管理站點。你將在本的第2部分使用到它djacdjacts djacs djacsdjacis$pythonmanage.pymig查看INSTALLED_APPS設(shè)置并根據(jù)m.y文件中的數(shù)據(jù)庫設(shè)置創(chuàng)建任 (PostgreSQL),SHOWTABLES;(MySQL)或.sc()來顯示Django創(chuàng)建的表們。如果你不需要它們中的任何一個或所有應(yīng)用,可以在運行miga之前從INSE 命令將只為INS中的myst 下,那么進入這$pythonmanage.pyQuittheQuittheserverwithCONTROL-StartingdevelopmentserverDjangoversion1.8,usingsettingsMay13,2015-0errorsPerformingsystem服務(wù)器。我們在器 既然服務(wù)器已經(jīng)運行,請用你的瀏覽器。在淡藍色背景下,你 etoDjango”的頁面。它運行成功了!默認情況下,runserverIP8000令在8080端口啟動服務(wù)器:$pythonmanage.pyrunserver$pythonmanage.pyrunserverrunserverPython器。然而,一些行為比如添加文件,不會觸發(fā)服務(wù)器的重啟,所以在這種情況下你需要手動創(chuàng)建模型現(xiàn)在,你的開發(fā)環(huán)境——一個“項目”——已經(jīng)建立起來,你將開始在上面做一些東西。DjangoPythonDjango它可以自動生成應(yīng)用的基本結(jié)構(gòu),這樣你就能專心于書寫代碼而不是創(chuàng)建。vs.項目和應(yīng)用之間有什么不同?應(yīng)用是一個Web博客系統(tǒng)、一個公共的數(shù)據(jù)庫或者一個簡單的投票應(yīng)用。項目是一個特定中相你的應(yīng)用可以放在Pythonpath上的任何位置。在本中,在你的manage.py文件同 創(chuàng)建我們的投票應(yīng)用,以便可以將它作為頂層模塊導(dǎo)入,而不是mysite的子模塊。確保你在與manage.py相同 $pythonmanage.pystartapp pol它的結(jié)構(gòu)如下init init 模型了數(shù)據(jù)的唯一、明確的真實來源。它包含了正在的數(shù)據(jù)的基本字段和為。DjangoDRY(Don'trepeatyourself)原則。這個原則的目標是在一個地方定義你RubyOnRails在這個簡單的投票應(yīng)用中,創(chuàng)建兩個模型: Question和Choice。Question對象具有一個question_text(問題)屬性和一個publish_date()屬性。Choice有兩個字段:選擇的內(nèi)容和選擇的得票統(tǒng)計。每個Choice與一個Question關(guān)聯(lián)。pol/fromdjanimpclassQues: question_text=.=) pub_date=models.DateTimeField('dateclassChoi: question= choice_text=.h=) votes=.=)djagdDateTimeField。這種方法告訴Django,每個字段中保存著什么類型的數(shù)據(jù)。Field實例的名字(例question_text或pub_date)就是字段的名字,并且是機器字(實例名)。在這個例子中,我們只為Question.pub_date定義一個人類可讀的名字。對于這個模型中其他的字段,機器可讀的名字(實例名)足以充分地表達出它的含義。某些Field 類具有必選的參數(shù)。例如,CharField要求你給它一個max_length。這個參數(shù)不僅Fieldvotes字段的默認值0ForeignKeyDjangoChoice激活模型 語句)為Question對象和Choice對象創(chuàng)建一個數(shù)據(jù)庫的pythonAPI但是,我們首先得告訴項目pols應(yīng)用已經(jīng)安裝。用,因為它們不需要與某個特定的Django安裝綁定。myssyINSTALLED_APPS設(shè)置以包含字符串'polls'INSTALLED_APPSINSTALLED_APPS= Djangopol應(yīng)用。讓我們運行另外一個命令:$pythonmanage.pymakemigrationsMigrationsfor -Createmodel -Createmodel -AddfieldquestiontomakemigrationsDjango,已經(jīng)對模型做了一些更改(在這個例子中,你創(chuàng)建了一個新的模型)并且會將這些更改為遷移文件。磁盤上的普通文件。如果愿意,你可以閱讀遷移文件來了解新模型;這個遷移文件就 poliiy。不用擔(dān)心,Django不要求你在每次Django生成改一下Django的某些具體行為。migrSQLsqlm命令SQL$pythonmanage.pysqlmigratepollsBEGIN;CREATETABLE"polls_choice""id""id"serialNOTNULLPRI"choice_text""choice_text"varchar(200)NOT"question_text"varchar(200)"question_text"varchar(200)NOT"id"serialNOTNULLPRI"votes"integerNOTNULL);CREATETABLE"polls_question" "pub_date"timawithtimezoneNOTNULL);ALTERTABLE"polls_choice"ADDCOLUMN"question_id"integerNOTNULL;ALTERTABLE"polls_choice"ALTERCOLUMN"question_id"DROPDEFAULT;CREATEIND"polls_choice_7aa0f6ee"ON"polls_choice"("question_id");ALTERTABLE"polls_choice" FOREIGN REFERENCES"polls_question" DEFERRABLEINIDEFERRED;PostgreSQLpolchoice。(你可以重寫這個行為。)主鍵(IDs)是自動添加的。(按照慣例,Django"_id"。(是的,你依然可以重寫這個行外鍵關(guān)系由FOREIGNKEY約束顯式。不用在意DEFERRABLE部分;它只是告PostgreSQL例如auto_increment(MySQL)、serial(PostgreSQL)或int prikey )。在處理字段名的引號時也是如此sqlaDjango ,你還可以運行pythonmanage.pycheck;它會檢查你的項目中的模型是否存在mig$pythonmanage.pymigrateOperationstoperform:Synchronizeunmigratedapps:staticfiles,messagesApplyallmigrations:admin,contenttypes,polls,sessionsSynchronizingappswithoutmigrations:Creating deferredSQL...deferredSQL...InstallingcustomSQL...Runningmigrations:Renderingstates...DONEstates...DONEApplying<migrationname>...mig 命令會找出所有還沒有被應(yīng)用的遷移文件(Djangodjam 重新生成一個新的——它專注于升級你的數(shù)據(jù)庫且不丟失數(shù)據(jù)。在本的后續(xù)章修改你的模型(在mod.y文件中)運行 migt 版本控制系統(tǒng)中并跟隨你的應(yīng)用一起變化;這樣做不僅可以使開發(fā)變得更加簡單,而且對其閱讀django-admin的文檔來了解 玩轉(zhuǎn)現(xiàn)在,讓我們進入Python的交互式s,玩轉(zhuǎn)這些Django提供給你的API。使用如下命令來調(diào)用Pythons:$$pythonmanage.py我們使用上述命令而不是簡單地鍵入“python”進入python環(huán)境,是因為manage.py設(shè)置了DJANGO_SETTINGS_MODULE環(huán)境變量,該變環(huán)境變量告訴Djangomysig文繞開如果你不想使用manage.py,也沒問題。只要設(shè)置DJANGO_SETTINGS_MODULE 為myss啟動一個普通的Pythons,然后建立Django:>>>importdja如果以上命令了一個AttributeError,可能是你使用了一個和本不匹配的Django版本 下運行python,或確保你 impmysite所有這些信息,請參見django-admin的文檔。>>>frompolimportQuestion, #Importthemodelclassesjust#Noquestionsareinthesystemyet.>>>#CreateanewQuestion.#Supportfortimezonesisenabledinthedefaultsettingsfile,so#Djangoexpectsadatetimewithtzinfoforpub_date.Usetimezone.now()#insteadofdatetime.datetime.now()anditwilldothething.>>>fromdjaimporttimezone>>>q=Question(question_text="What'snew?",=.)#Savetheobjectintothedatabase.Youhavetocallsave()explicitly.>>>#NowithasanID.Notethatthismightsay"1L"insteadof"1",depending#whichdatabaseyou'reusing.That'snobiggie;itjustmeansyour#databasebackendpreferstoreturnintegersasPythonlonginteger#objects.>>>q.id1#AccessmodelfieldvaluesviaPythonattributes.>>>q.question_text"What'snew?">>>q.pub_datedatetime.datetime(2012,2,26,13,0,0,775217,tzinfo=<UTC>)#Changevaluesbychangingtheattributes,thencallingsave().>>>q.question_text="What'sup?">>>q.save()#objects.all()dis ysallthequestionsinthedatabase.>>>Question.objects.all()[<Question:Questionobject>]fromdjanimpclassQfromdjanimpclassQues# # #returnclassChoi# returnonPythononPython給你的模型添加onPythonDjango 還 unicode對于Python3來說,這很簡單,只需使用 ()對于Python2來說,你應(yīng)該定義unicode()方法并返回unicode值。Django模型具有一個默認的 方法,它會調(diào)用unicode()并將結(jié)果轉(zhuǎn)換為UTF-8字節(jié)字符串。這味著uni(將返回一個Unicode字符串,而str(p)UTF-8編碼。Python的行為則相反:對象的 方法調(diào) ASCIIfromdjafromdjanimpmodelsfromdjaimportimpclassQues:##returnreturnself.pub_date>=timezone.now()-.=def注意impdatetime和fromdjansimpotim分別Python的標準datetime模塊djate中時區(qū)相關(guān)的工具。如果你不Python時區(qū)的處理方法,你可以在時區(qū)支持的文檔中了解的知識。保存這些改動,然后通過pythonmanage.pys再次打開一個新的Python>>>from>>>frompolimportQuestion,#MakesureWhat's

()additionworked.>>>#DjangoprovidesarichdatabaselookupAPIthat'sentirelydrivenby#keywordarguments.>>>..(=:What'sup?>]>>>Question.objects.filter(question_textstartswith='What')[<Question:What'sup?>]#Getthequestionthatwaspublishedthisyear.>>>fromdjaimptimezone>>>current_year=..>>>Question.objects.get(pub_dateyear=current_year)<Question:What'sup?>#RequestanIDthatdoesn'texist,thiswillraiseanexception.>>>..=k(mostrecentcalllast):...DoesNotExist:Questionmatchingquerydoesnot#Lookupbyaprimarykeyisthemostcommoncase,soDjangoprovidesa#shortcutforprimary-keyexactlookups.#ThefollowingisidenticaltoQuestion.objects.get(id=1).>>>..=:What'sup?>#Makesureourcustommethodworked.>>>q=..=>#GivetheQuestionacoupleofChoices.Thecreatecallconstructsanew#object,doestheINSERTstatement,addsthechoicetotheset#ofchoicesandreturnsthenewChoiceobject.Djangocreates#asettohold"otherside"ofaForeignKeyrelation#(e.g.aquestion'schoice)whichcanaccessedviatheAPI.>>>q=..=#Dis yanychoicesfromtherelatedobjectset--nonesofar.>>>#Createthreechoices.>>>..t=tvotes=0)<Choice:Notmuch>>>>..t=esky',votes=0)<Choice:Thesky>>>>c=..c=thackingagain',votes=0)#ChoiceobjectshaveAPIaccesstotheirrelatedQuestionobjects.>>>c.question<Question:What'sup?>#Andviceversa:QuestionobjectsgetaccesstoChoiceobjects.>>>q.choice_set.all()[<Choice:Notmuch>,<Choice:Thesky>,<Choice:Justhackingagain>]>>>q.choice_set.count()3#TheAPIautomaticallyfollowsrelationshipsasfarasyouneed.#Usedoubleunderscorestoseparaterelationships.#Thisworksasmanylevelsdeepasthisyear#(reusingthe'current_year'variablewecreatedthisyear#(reusingthe'current_year'variablewecreatedChoice.objects.filter(questionpub_dateyear=current_year)[<Choice:Notwant;there'snolimit.#FindallChoicesforanyquestionwhosepub_dateis<Choice:Thesky>,<Choice:Justhacking#Let'sdeleteoneofthechoices.Usedelete()forthat.>>>c=q.choice_set.filter(choice_textstartswith='Justhacking')>>>c.delete()來執(zhí)行字段查詢的信息,請查看字段查詢。關(guān)于數(shù)據(jù)庫API的信息,請查看我們的數(shù)據(jù)API參考。力的工作。為此,Django會根據(jù)你寫的模型文件完全自動地生成管理界面。站點有著非常明顯的界限。管理者使用管理界面來添加故事、、體育比賽分管理界面不是讓的人使用的,它服務(wù)于管理者。它用于的管理員$pythonmanage.pyUsername: address: address: 最后一步是輸入你的。你將被要求輸入你的兩次,第二次輸入是為了確認第一次的Password:**********Password(again):*********SuperusercreatedDjango從1中我們了解到,你能通過使用如下命令來啟動開發(fā)服務(wù)器:$pythonmanage.py現(xiàn)在,打開一個瀏覽器你本地中的“/admin/”——例定和Django是否具有這種語言的翻譯。ImportErroratImportErroratcannotimportname你可能使用的是不符合本的Django版本。你需要換一個老版本的或者換一個新版你將看到幾類可編輯的內(nèi)容:groupsusersdjagh提供的,這個認證框架集成在Django中。讓poQuestion需要打開pold文件,把它編輯成這樣:fromdjanimportfrom.modimpQuestion現(xiàn)在,我們已經(jīng)在管理站點中了Question對象,Django知道它應(yīng)該被顯示在管理站點的首單擊“What’sup?”這個表單是根據(jù)QuestionDateTimeFieldJavaScript快捷方式。Date有個“Today”的快捷鍵和一個彈出式日歷,time欄有個“Now”的快捷鍵和一個列出常用時間選項的彈出式窗 SaveandcontinueeditingSaveandadd 因為你忘記將TIMO設(shè)置為正確的值。修改它,然后重新載入這個界面,檢查一下正確的通過“Today”和“Now”這兩個快捷方式來更改“Datepublished”字段。然后點擊“Saveandcontinueediting”。然后點擊右上角的“History”按鈕。你將看到一個頁面,列出了花幾分鐘感嘆一下吧,你沒寫什么代碼,卻得到了這一切。只需使用admiee)Question模型,Django就能構(gòu)造一個默認的表單表示。通常,你會想要自定義管理界面中表單的外觀和功能。你可以通過在對象的時候告知fromdjanimportfrom.mfromdjanimportfrom.modimpclassclassQuesdn:fields=['pub_date',admin.site.register(Question,理對象,然后把該對象作為第二個參數(shù)傳入adm.()。上面那特定的更改,使得“Publicationdate”字段排在“Questionfromfromdjanimportfrom.modimpfieldsetsfieldsets=classQues:{'fields':{'fields':('Date('Dateinformation',{'fields':]adminadmin.site.register(Question,fieldsetsfromdjanimportadminfrom.modimpQuestionclassQues: fieldsets= {'fields': ('Dateinformation',{'fields':['pub_date'],'classes': admin.site.register(Question,好了,我們已經(jīng)有自己的Question管理界面。QuestionChoices“Addchoice Django知道ForeignKey應(yīng)該在管理界面中顯示為一個<select>選框。在我們的例子中,目前選框里只有一個Question。另外,注意一下“Question”旁邊的“AddAnother” 關(guān)系的對象都有一個這種。當(dāng)你點擊“AddAnother”,你將看到一個帶有“Addquestion”表單的彈出窗口。如果你在這個窗口中添加了一個Question并點擊“Save”,ChoiceQuestion對象的同時Choice移除對Choice模型的register()調(diào)用。然后將Question的代碼編輯為fromdfromdjanimprtfrom.modimpChoice,extra=model=classChoi:fieldsets=classQues:{'fields':{'fields':('Date('Dateinformation',{'fields':['pub_date'],'classes':] inlines=[ChoiceInline]admin.site.register(Question,QuestionAdmin)Django:ChoiceQuestion3Choice間。打開“Addquestion”頁面來看看它的樣子:它這樣工作:有三個所關(guān)聯(lián)的 ——由extra指定——每次你回到已經(jīng)存在對象"Change"Choice在現(xiàn)有的三個Choice的底部,你會發(fā)現(xiàn)一個“AddanotherChoice”的。如果你點擊角的X。請注意,你無法移除那最初的三個空白Choice。下面的展示新增加的一個空白還有個小問題。顯示所有關(guān)聯(lián)的Choice對象的字段占用大量的屏幕空間。為了解決這個問題,Django提供了一種以表格的形式顯示內(nèi)嵌的相關(guān)聯(lián)對象的方法;你只需改變一下ChoiceInline的 classclass使用TabularInline(StackedInline),這些相關(guān)聯(lián)的對象顯示成緊湊的、基于表格的請注意有一個額外的列“Delete?”,它允許刪除使用“AddAnotherChoice界面顯示系統(tǒng)中所有的Question。默認地,Django顯示每個對象的str()返回的內(nèi)容。但有時如果我們能顯示每個字段將很有幫助。我們使用list_disy選項來實現(xiàn)這個功能,它是一個要顯示的字段名稱的元組,在## y=('question_text',classQues: 1中自定義的方法 # y=('question_text','pub_date',classQues# y=('question_text','pub_date',你可以點擊其中一列的頭部來讓列表按照這列的值來進行排序——除了was_published_recentlyDjango不支持按照隨便一個方法的輸出進行排序。另外注意,was_published_recently這列的頭部默認是這個方法的名字(用空格取代下劃你可以通過給這個方法(在polm classQues: # def returnself.pub_date>=timezone.now()-.=) was_published_recently.admin_order_field= was_published_recently.boolean= was_published_recently.short_description='Published關(guān)于這些方法屬性的信息,請參見list_disypolaQuestionlist_filter來添加QuestionAdmin:list_filter=這行代碼添加一個“Filter”側(cè)邊欄,可以使人們通過 顯示的過濾器類型取決于你所使用的字段類型。pub_dateDateTimeFieldmonth”、“Thisyear”。search_fields=這行代碼在變更列表的頂部添加了一個搜索框。當(dāng)有人將搜索的內(nèi)容輸入搜索框,Django將在question_text字段中進行搜索。你可以使用任意數(shù)量的字段進行搜索——但由于它在使用LIKE進行查詢,所以限制搜索字段的數(shù)量會使數(shù)據(jù)庫查詢更加容易?,F(xiàn)在又是一個好時機來告訴你變更列表界面提供方便的分頁功能。默認每頁顯示100條記Changelistpagination、searchboxes、filters、date-hierarchiescolumn-header-ordering都將按照你設(shè)想的那樣工作。很明顯,每個管理頁面的頂部都有“Djangoadministration”還蠻搞笑的。它僅僅起到了占位的界面代碼使用的是Django自己的模板系統(tǒng)。自定義項目的模板在你項目的文件夾內(nèi)(包含manage.py的 )創(chuàng)建一個temtes 打開你的配置文件(記住是mys/在TEM TES設(shè)置中添加一個DIRS TES= 'BACKEND': 'BACKEND': 'DIRS':[os.path.join(BASE_DIR, 'APP_DIRS': 'OPTIONS': 'context_processors': 是加載Django模板時檢查的一個文件系 現(xiàn)在,在mtes下創(chuàng)建一個名為admin ,然后從Django源碼中管理站點的模djacemtes)將admin/base_site.html拷貝到這 中$python-c"importsyssys.path=sys.path[1:]importdjangoprint(django.path)" admn}} {blobranding%}<h1id="site-name"><a{%url'admin:index'%}">Polls</ah%endblock%}djacde 模板文件包含許多類似{%blockbranding%}和 title}}這樣的文本。 {{ DjangoDjango渲染admit這些模板語言將被求值以生成最終的HTML文件。如果你被模板給弄愣了不用擔(dān)心——在3深入DjangoDjangobase_site.html相同的操作就行——將它從默認的拷貝到你自定義的中,然后修自定義應(yīng)用是,由于APP_DIRS設(shè)置為True,Django會自動地在每個應(yīng)用包下面查找一個temtes/子目錄,留作備用。(別忘了dja.也是一個應(yīng)用)。保Django將找到它需要的自定義模板文件。DjangoINSL需要自定義的模板文件是admi。(admin/base_site.html樣——將它從默認的拷貝到你自定義的中)。編輯這個文件,你將看到它有一個叫app_listDjango使用它,而是以你認為最好的方式硬編碼到每個對象自己的管理頁面。再次強調(diào)一點,你不理解模板語言也沒關(guān)系——在3中對它進行詳細介紹當(dāng)你對管理站點感到滿意后,請閱讀的第3一個對外的界面——“視圖”上。博客首頁——顯示的博客博客“詳細”頁面——單篇博客的固定頁面基于年份的歸檔頁面——顯示某給定年份里所有月份過的博客基于月份的歸檔頁面——顯示在給定月份中過博客的所有日期基于日期的歸檔頁面——顯示在給定日期中過的所有博客名稱應(yīng))。每個視圖都是由一個簡單的Python函數(shù)表示的(對于基于類的視圖,一個視圖是平上網(wǎng)時,可能會遇到像 這樣"優(yōu)美"的URL。你將會愉快地了解到,Django允許我們使用更加優(yōu)雅的URL模式。URL模式就是一個URL的通用形式——例如:/newsarchive/<year>/<month>/Django‘URLconfs’URLURLconfURLdjacrs讓我們來編寫第一個視圖。pol/Pythonfromdjanimpdefdefindx:returno,world.You'reatthepollsDjangoURLURLconf 內(nèi)部創(chuàng)建URLconf,需要創(chuàng)建一個url.文件。你的應(yīng)用的 init 在polryfromdjanimpoturlfrom.importviewsurlpatterns=[ url(r'^$',views.index,下一步,讓主URLconf可以到pol.s模塊。在mysite/urls.py中插入一inc(fromdjanimportinclude,urlfromdja.impurl(r'^polls/',url(r'^admin/',url(r'^polls/',url(r'^admin/',如果你看到在urlts的定義前有admin.autodiscover(),你可能使用的是不符合本教程的Django版本。你需要換一個老版本的 或者換一個新版的Django。現(xiàn)在我們已經(jīng)將一個ind視圖關(guān)聯(lián)到URLconf覽,你會看到“o,world.You’reatthepollsindex.”,正如你在ind視圖中定義的那樣.url view,以及兩個可選的kwargsname。url 術(shù)語“regex”是“regularexpression(正則表達式)”的常用的一個縮寫,是一種用來匹URL模式。DjangoURL與每個正則表達式進行匹配,直到找到匹配的那個為止。請注意,這些正則表達式不會檢索URL中GET和POST的參數(shù)以及。例如,對 /myapp/請求,URLconfmyapp/ /myapp/?page=3請求,URLconfmyapp/如果你需要正則表達式方面的幫助,參見Wikipedia條 和 模塊的文檔。另外ReillyJeffreyFriedl編寫的“MasteringRegularExpressions”是一本極好的URL譯。它們超級快(只要這些正則表達式不像上面提醒的那樣過于復(fù)雜)。ul DjangoviewHttpRequest對象作為第一個參數(shù),從正則表達式中“捕獲”的其他值作為其他參數(shù),傳入到該視圖函數(shù)中。如果正則表達式使用簡單的捕獲方式,值將作為位置參數(shù)傳遞;如果使用url 參數(shù)任何關(guān)鍵字參數(shù)都可以以字典形式傳遞給目標視圖。我們在這個里用不到Django的ul 參數(shù):URL。這個強大的特性可以使你僅僅修改一個文件就可以改變?nèi)值腢RL模式。編寫的視defdeti,現(xiàn)在讓我們給pdefdeti, returnHttpResponse("You'relookingatquestion%s."%question_id)defresults(request,question_id): response="You'relookingattheresultsofquestion returnHttpResponse(response%question_id)defvote(request,question_id): returnHttpResponse("You'revotingonquestion%s."%通過下面的url 調(diào)用將這些新的視圖和poll模塊關(guān)聯(lián)起來fromdjanimpotfrom.importurlpatterns= #ex: url(r'^$',views.index, #ex: url(r'^(?P<question_id>[0-9]+)/$',views.detail, #ex: url(r'^(?P<question_id>[0-9]+)/results/$',views.results, #ex: url(r'^(?P<question_id>[0-9]+)/vote/$',views.vote,在你的瀏覽器中“/polls/34/”。它將運行detail()方法并顯示你在URL中提供ID。再試一下“/polls/34/results/”和“/polls/34/vote/”——它們將顯示出對應(yīng)當(dāng)有人請求你的的一個頁面時——比如“/polls/34/”,Django將加載mysu Python模塊,因為ROOT_URLCONF設(shè)置指定了它。它尋找名為urle 的變量并按順序匹配其中的正則表達式。我們使用的inc)函數(shù)來只是incdincd去掉,然后將剩下的字符串交由include()指定的URLconf做進一步處理。inc(背后的想法是使URL變得即插即用。因為投票應(yīng)用擁有它自己的URLconfpolr'^pl—"34/"polls.urls’URLconfr'^q9]+)/$'并導(dǎo)致像下面這樣調(diào)用detail()視圖detail(request=<HttpRequestobject>,quesion_id='34'部分來自(?P<question_id>[09]+)。使用圓括號包圍一個模式可以“捕?P<uesin_id>[0-9]+瑣的URL——除非你執(zhí)意這么做,在這種情況下你可以這樣做:url(r'^polls/latest\.html$',views.index),但是,真的不要這樣做。每個視圖函數(shù)只負責(zé)處理兩件事中的一件:返回一個包含所請求頁面內(nèi)容的HttpResponse對象,或拋出一個諸如Http404異常。該如何去做這兩件事,就看你自己的想法了。你的視圖可以從數(shù)據(jù)庫中記錄,或者不數(shù)據(jù)庫。你可以使用一套模板系統(tǒng),例如Django的——或者第的Python模板系統(tǒng)——或者不用模板系統(tǒng)。你還可以動態(tài)地生成一個PDF文件、輸出XML文件、創(chuàng)建一個ZIP文件或者使用你想用的Python庫生成DjangoHttpResponse。為了方便,讓我們使用1中介紹的Django自己的數(shù)據(jù)庫API。下面是一個新ind視圖,它顯示系統(tǒng)中發(fā)布的5條questions記錄,并用逗號分隔fromdjanimpHttpResponsefrom.modimpQuestiondefindx: latest_question_list=Question.objects.order_by('- output=','.join([p.question_textforpi return#Leavetherestoftheviews(detail,results,vote)這里有一個問題:頁面的設(shè)計被硬編碼在視圖中。如果你想更改頁面的外觀,就得編輯這PythonDjango板,將頁面的設(shè)計從Python中分離出來。首先,在你的pol 下創(chuàng)建一個叫做tmtes的 你項目的ttes設(shè)置描述了Django將如何加載并渲染模板。默認的設(shè)置文件settings.py配置了一個DjaTmtes后端,其中將APP_DIRS選項設(shè)置為True。按照慣例Djaemtes在INSLS所包含的每個應(yīng)用的 tes" 。這就是為什么我們沒有像在2中那樣修改DIRS,Django也能 下pol/mtes)而不是項目模 下(temtes)。在你剛剛創(chuàng)建的tmtes indt。換句話講,你的模板應(yīng)該位于polmtes/polls/index.html。由于app_directories模板加載器按照上面描述的方式工作,在Django中你可以簡單地用polnl這個模板?,F(xiàn)在,我們可以直接將我們的模板放在pol/mtes中(而不用創(chuàng)建另外一個polls),但實際上這是個壞主意。Django將選擇它找到的名字匹配的第一個模板文件,如果你在不同的應(yīng)用有相同名字的模板文件,Django將不能區(qū)分它們。我們需要將Django {iflatest_question_list {forquestionilatest_question_list <lihref="/polls/{{question.id}}/">{{question.question_text {endfor%} </uelse%} <p>Nopollsare</p>%end%}現(xiàn)在讓我們更新polv中的index ontext,fromdjanpimpHttpResponsefromdja teimp ontext,from.modimpdefdefindx:latest_question_list=Question.objects.order_by('-pub_date')[:5] te=loader.get_tem context= ontext(request, 'latest_question_list':return poli模板變量的名字映射到Python對象。"What'sup"Question。其指向Question的詳細頁面contextHttpResponse對象。Django為此提供一個快捷方式。indfromdjanimportrenderfrom.modimpQuestiondefindx: latest_question_list=Question.objects.order_by('- context={'latest_question_list': returnrender(request,'polls/index.html',注意,一旦我們在所有的視圖上都應(yīng)用這個快捷函數(shù),不再需要導(dǎo)入loader、 ontext和HttpResponse(如果你沒有改變先前的detail、results和vote方法,你將需要在導(dǎo)入中保留HttpResponse)。作為它可選的第三個參數(shù)。HttpResponsecontext渲染一個404QuestionQuestionfromdjanimpHttp404fromdjatimprenderfrom.modimpQuestion#...defdeta,question_id): question=..= except raiseHttp404("Questiondoesnot returnrender(request,'polls/detail.html',{'question':這里有一個新概念:如果沒有找到所請求ID的Question,這個視圖一個Http404 poldl模板文件里放些什么代碼,但如果你想快點 {{question一種常見的習(xí)慣是使用get()并在對象不存在時Http404。Django為此提供一個快捷方式。下面是重寫后的detail()視圖:fromdjanimportget_object_or_404,from.modimpQuestion#...defdeta, question=get_object_or_404(Question, returnrender(request,'polls/detail.html',{'question':question})數(shù)作為它的第二個參數(shù),它會將這些關(guān)鍵字參數(shù)傳遞給模型管理器中的get() 對象不存在,它就一個Http404異常。 get_object_or_404()而不是在更自動捕獲ObjoObjo?因為那樣做將會使模型層與視圖層耦合在一起。Django松耦合。一些可控的耦合將會在djaos模塊中介紹。還有一個get_list_or_404()函數(shù),它的工作方式類似get_object_or_404() ——差別在于它使用filter()而不是get()。如果列表為空則Http404。使用模板 detail()contextquestion,下面是polel模板可能的樣 <h1>{{question.question_text}}</forchoiceinquestion.choice_set.all%} <li>{{choice.choice_text}}</%endfor模板系統(tǒng)使用點號查找語法來變量的屬性。在 question.question_text}}個例子中,Djangoquestion對象上做字典查詢。如果失敗,Django會接著嘗試屬性查詢——在這個例子中,屬性查詢會成功。如果屬性查詢也失敗,Django將嘗試列表索方法調(diào)用發(fā)生在{% %}循環(huán)中:question.choice_set.all被解釋為Python的代,它返回一個由{% %}移除模板中硬編碼的poli<lihref="/polls/{{question.id}}/">{{question.question_text}}</a></li>URLs,那將會變得很有性。然而,因為你在pol.模塊的url()函數(shù)中定義了name參數(shù),你可以通過使用{%url %}模板來移除對你的URL配置中定義的特定的URL的依賴:<li{%urlquestion.id%}">{{question.question_text...#the'name'valueascalledbythe...#the'name'valueascalledbythe{%url%}tagurl(r'^(?P<question_id>[0-9]+)/$',views.detail,=...pols可以不必在該模板(或者多個模板)中修改它,只需要修改pols:...#addedtheword'specifics'url(r'^specifics/(?P<question_id>[0-9]+)/$',views.detail,=...帶命名空間的URL中的這個項目只有一個應(yīng)用pol。在真實的Django項目中,可能會有五個、十個、二十個或者的應(yīng)用。Django如何區(qū)分它們URL的名字呢?例如,polls應(yīng)用具有一個detail視圖,相同項目中的博客應(yīng)用可能也有這樣一個視圖。當(dāng)使用模板{%url%}DjangoURLURLconfmyseyfromdjanimportinclude,urlfromdja.impadminurlpatterns=[ url(r'^polls/',include('polls.urls', url(r'^admin/',poli <li{%urlquestion.id%}">{{question.question_text <li{%urlquestion.id%}">{{question.question_text <h1>{{question.question_text <h1>{{question.question_text {{iferror_message%}<p><strong>{{error_message}}</end%}<fo{%url'polls:vote'question.id%}"method="post">{%csrf_token%}{%forchoiceiquestion.choice_set.all%} <intype="radio"name="choice"id="choice{{forloop.counter}}"value="{{choice.id}}"/> <lafor="choice{{forloop.counter}}">{{choice.choice_text/>{%endfor%}<inputtype="submit"value="Vote"QuestionChoicevalue屬性ChoiceIDname是"choice"。這意味著,當(dāng)有人選擇一個單選按鈕并提交表單提交時,它將發(fā)送一個POST數(shù)據(jù)choice=#,其中#為選擇的Choice的我們設(shè)置表單的action為 'poo %},并置met""。使用method="post"(與其相對的是method="get")因為這個提交表單的行為會改變服務(wù)器端的數(shù)據(jù)。無論何時,當(dāng)你需要創(chuàng)建一個改變服務(wù)器端數(shù)據(jù)的表單時,請使用metd。這不是Django的特定技巧;這是優(yōu)秀的forloop.counter指示for已經(jīng)循環(huán)多少次Django系統(tǒng)。簡而言之,所有針對內(nèi)部URLPOSTcsrf_token%}模板標現(xiàn)在,讓我們來創(chuàng)建一個Django視圖來處理提交的數(shù)據(jù)。記住,在3中,我們?yōu)橥镀睉?yīng)用創(chuàng)建了一個URLconf,包含這一行:url(r'^(?P<question_id>[0-9]+)/vote/$',views.vote,fromdjan

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論