Django拾遺--pagination、sitemap、admin、form

Django拾遺--pagination、sitemap、admin、form

pagination

其實這個分頁模塊的原理就是根據設定的每頁條數來分割queryset。查詢結果/每頁子項數目=頁數css

使用方法

傳入實現了__iter__的object(通常來說就是queryset)和指望的每頁子項數給Pagination來生成分頁處理器的實例。python

根據這個分頁生成器的page方法,傳入頁數就能夠獲得相應頁數的內容。數據庫

page = pagination.page(1)django

經常使用方法

生成器函數

num_pages:分頁後的總頁數post

page_range:分頁後總頁數的迭代url

分頁對象code

has_next()/has_previous():判斷先後是否還有orm

next_page_number()/previous_page_number():先後的頁數數字csrf

常見異常處理

遇到超出頁數範圍時會拋出emptypage

我的踩坑

在作文章的先後翻頁時,也用了這個,將每頁子項數設爲1,就能夠達到效果。

可是這個生成的分頁的頁數是以1爲base的,因此先後頁的跳轉url參數不能直接用頁數。

sitemap

最開始生成的sitemap是本身經過查數據庫而後生成的,後面發現Django有內置的模塊。

啓用相關模塊

django.contrib.sitemaps加到INSTALLED_APPS中去。

已經啓用了sites framework

關於sites framework

其做用主要是提供一個鉤子函數get_current_site來獲取當前的主域信息。

實現原理是先在DB創建一個存放site信息的表,而後在settings文件中指明site_id,這樣就能夠在調用鉤子函數時,根據這個id來獲得對應的信息。

至於如何啓用這個功能,先是將django.contrib.sites加到INSTALLED_APPS中,而後設置SITE_ID,而後執行migrate來生成表。

使用方法

其實具體實現起來跟普通視圖大同小異,只是Django內置了一個專門處理這個的視圖函數,也就是django.contrib.sitemaps.views中的sitemap,這是一個函數型的視圖函數。

至於須要渲染出來的信息也是用Django內置的Sitemaps類包裹,其實就是在類中指明要查找的信息。

最後在配置URLCONF的時候,視圖函數用內置的,參數Sitemaps用咱們本身重寫的,若是有自定義模版也一塊兒附上就能夠了。

當sitemap信息超過50000條的時候,須要分頁,則須要用到sitemap的索引函數,暫時尚未這個需求,因此先不作。

admin

啓用相關模塊

默認配置是啓用了後臺管理模塊的,而後須要作的先是manage.py createsuperusr建立管理者用戶,而後再URLCONF中配置好路由url(r'^admin', admin.site.urls)就能夠了。

使用方法

在用後臺管理以前,我要修改數據時,要麼經過python調用Django的orm去操做數據庫,要麼經過數據庫的相關管理軟件來對數據庫進行操做,後臺管理的便利之處就在於能夠在這個管理後臺的頁面對數據進行修改。(其實就是我暫時只知道能這樣作,更多功能在有相關需求的時候再去挖掘吧)

既然這個後臺管理是方便咱們管理這些數據的,那麼咱們須要關注的地方就在選擇展現哪些數據。如何展現呢,其實就是建立admin.ModelAdmin的子類,在這裏面選擇要展現的model(也就是那一個表),指出要展現的數據字段,展現規則,是否只讀,排列順序等各類配置。最後將這個子類和對應的model註冊到admin.site.register裏,這樣在後臺管理就能看到對應的信息了。

form

Django內置了表單模塊,用這個表單模塊能夠直接生成表單。

我的理解

Django內置了幾種類,首先是Form類,這個類的申明跟model差很少,對每一個字段進行定義,在view視圖使用的時候就是將其實例化便可。

對原有的視圖邏輯影響不大,只須要增長判斷,在post請求的時候,將post內容傳入給類生成實例,而後處理,跳轉;在其餘請求的時候,生成一個內容爲空的實例,實際上就是在頁面生成一個空的表單。

在模版文件中,只需傳入這個實例就能夠自動生成表單了,固然必定要記得加上{% csrf_token %}這個,防止跨站僞造攻擊。

而後就是Formset這個類,我的理解這個就是多個form加起來而已,也就是同時生成多個表單,我的在理解max_numextra這個兩個參數的時候有些犯渾,如今也記錄一下,max_num是這些表單的總數,extra是生成的空白表單數,生成表單的時候,分爲有初始值和無初始值,無初始值的那個表單個數就由extra決定,若是有初始值的表單個數大於或等於max_num,則extra這個參數等於沒有用了,最終只會生成有初始值表單的個數,這個數是能夠大於max_num的。

接着是ModelForm,這個類的好處在於根據已存在的model來生成form,相似繼承,選擇性繼承字段,而且能夠直接對已存在數據進行修改。不過也正是由於這樣,驗證數據的時候會有兩步,先是驗證表單數據,而後驗證這個實例的數據與DB是否相符(表單數據類型是能夠再定義的,因此不必定與model相等),注意的是,第一步完了以後會生成一個實例,若是在驗證後須要更改數據的話,也須要改兩次,一個是cleaned_data,一個是實例的。

最後是ModelFormset,這個暫時用不上,先放下。

在css和js方面,能夠在class Media屬性中設置自定義。

相關文章
相關標籤/搜索