日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Django 1.10中文文档-自定义管理站点(django)

發(fā)布時間:2023/12/15 综合教程 24 生活家
生活随笔 收集整理的這篇文章主要介紹了 Django 1.10中文文档-自定义管理站点(django) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

開發(fā)第一個Django應(yīng)用,Part7

  本教程上接Part6。將繼續(xù)完成這個投票應(yīng)用,本節(jié)將著重講解如果用Django自動生成后臺管理網(wǎng)站。

自定義管理表單

  通過admin.site.register(Question)注冊了Question后,Django可以自動構(gòu)建一個默認的表單。如果您需要自定義管理表單的外觀和功能。你可以在注冊時通過配置來實現(xiàn)。

  現(xiàn)在先來試試重新排序表單上的字段。只需要將admin.site.register(Question)所在行替換為:

# polls/admin.pyfrom django.contrib import adminfrom .models import Questionclass QuestionAdmin(admin.ModelAdmin):fields = ['pub_date', 'question_text']

admin.site.register(Question, QuestionAdmin)

登錄后復制

  你可以參照上面的形式,創(chuàng)建一個模型類,將之作為第二個參數(shù)傳入admin.site.register()。而且這種操作在任何時候都可以進行。

  經(jīng)過上面修改”Publication date”字段會在”Question”字段前面:

  目前的表單只有兩個字段可能看不出什么,但是對于一個字段很多的表單,設(shè)計一個直觀合理的排序方式非常重要。并且在字段數(shù)據(jù)很多時,還可以將表單分割成多個字段的集合:

# polls/admin.pyfrom django.contrib import adminfrom .models import Questionclass QuestionAdmin(admin.ModelAdmin):fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

admin.site.register(Question, QuestionAdmin)

登錄后復制

  字段集合中每一個元組的第一個元素是該字段集合的標題。它讓頁面看起來像下面的樣子:

添加關(guān)聯(lián)對象

  現(xiàn)在Question的管理頁面有了,但是一個Question應(yīng)該有多個Choices。而此時管理頁面并沒有顯示。現(xiàn)在有兩個方法可以解決這個問題。一是就像剛剛Question一樣也將Choice注冊到admin界面。代碼像這樣:

# polls/admin.pyfrom django.contrib import adminfrom .models import Choice, Question# ...admin.site.register(Choice)

登錄后復制

  現(xiàn)在Choice也可以在admin頁面看見了,其中”Add choice”表單應(yīng)該類似這樣:

  在這個表單中,Question字段是一個select選擇框,包含了當前數(shù)據(jù)庫中所有的Question實例。Django在admin站點中,自動地將所有的外鍵關(guān)系展示為一個select框。在我們的例子中,目前只有一個question對象存在。

  請注意圖中的綠色加號,它連接到Question模型。每一個包含外鍵關(guān)系的對象都會有這個綠色加號。點擊它,會彈出一個新增Question的表單,類似Question自己的添加表單。填入相關(guān)信息點擊保存后,Django自動將該Question保存在數(shù)據(jù)庫,并作為當前Choice的關(guān)聯(lián)外鍵對象。通俗講就是,新建一個Question并作為當前Choice的外鍵。

  但是,實話說,這種創(chuàng)建方式的效率不怎么樣。如果在創(chuàng)建Question對象的時候就可以直接添加一些Choice,那樣操作將會變得簡單些。

  刪除Choice模型對register()方法的調(diào)用。然后,編輯Question的注冊代碼如下:

# polls/admin.pyfrom django.contrib import adminfrom .models import Choice, Questionclass ChoiceInline(admin.StackedInline):model = Choice
    extra = 3class QuestionAdmin(admin.ModelAdmin):fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)

登錄后復制

  上面的代碼告訴Django:Choice對象將在Question管理頁面進行編輯,默認情況,請?zhí)峁?個Choice對象的編輯區(qū)域。

  現(xiàn)在”增加question”頁面變成了這樣:

  它的工作機制是:這里有3個插槽用于關(guān)聯(lián)Choices,而且每當你重新返回一個已經(jīng)存在的對象的“Change”頁面,你又將獲得3個新的額外的插槽可用。

  在3個插槽的最后,還有一個“Add another Choice”鏈接。點擊它,又可以獲得一個新的插槽。如果你想刪除新增的插槽,點擊它右上方的X圖標即可。但是,默認的三個插槽不可刪除。下面是新增插槽的樣子:

  但是現(xiàn)在還有個小問題。上面頁面中插槽縱隊排列的方式需要占據(jù)大塊的頁面空間,看起來很不方便。為此,Django提供了一種扁平化的顯示方式,你僅僅只需要將ChoiceInline繼承的類改為admin.TabularInline:

# polls/admin.pyclass ChoiceInline(admin.TabularInline):#...

登錄后復制

  使用TabularInline代替`StackedInline``,相關(guān)的對象將以一種更緊湊的表格形式顯示出來:

  注意,這樣多了一個”刪除”選項,它允許你刪除已經(jīng)存在的Choice.

自定義修改列表

  現(xiàn)在Question的管理頁面看起來已經(jīng)差不多了,下面來看看修改列表頁面,也就是顯示了所有question的頁面,即下圖這個頁面:

  Django默認只顯示str()方法指定的內(nèi)容。如果我們想要同時顯示一些別的內(nèi)容,可以使用list_display屬性,它是一個由多個字段組成的元組,其中的每一個字段都會按順序顯示在頁面上,代碼如下:

# polls/admin.pyclass QuestionAdmin(admin.ModelAdmin):# ...list_display = ('question_text', 'pub_date')

登錄后復制

  同時,還可以把Part2中的was_published_recently()方法也加入進來:

# polls/admin.pyclass QuestionAdmin(admin.ModelAdmin):# ...list_display = ('question_text', 'pub_date', 'was_published_recently')

登錄后復制

  現(xiàn)在question的修改列表頁面看起來像這樣:

  你可以點擊其中一列的表頭來讓列表按照這列的值來進行排序,但是was_published_recently這列的表頭不行,因為Django不支持按照隨便一個方法的輸出進行排序。另請注意,默認情況下,was_published_recently的列標題是方法的名稱(下劃線替換為空格),內(nèi)容則是輸出的字符串表示形式。

  可以通過給方法提供一些屬性來改進輸出的樣式,就如下面所示:

# polls/models.pyclass Question(models.Model):# ...def was_published_recently(self):now = timezone.now()return now - datetime.timedelta(days=1) <= self.pub_date <= now
    was_published_recently.admin_order_field = 'pub_date'was_published_recently.boolean = Truewas_published_recently.short_description = 'Published recently?'

登錄后復制

  關(guān)于這些方法屬性的更多信息,請參見list_display。
  
  我們還可以對顯示結(jié)果進行過濾,通過使用list_filter屬性。在QuestionAdmin中添加下面的代碼:

list_filter = ['pub_date']

登錄后復制

  它添加了一個“過濾器”側(cè)邊欄,這樣就可以通過pubdate字段來過濾顯示question:

  過濾器顯示的篩選類型取決與你過濾的字段,由于pub_dataDateTimeField,所以Django就自動給出了“今天”、“過去7天”、“本月”、“今年”這幾個選項。

  這一切進展順利。再添加一些搜索功能:

search_fields = ['question_text']

登錄后復制

  這行代碼在修改列表的頂部添加了一個搜索框。 當進行搜索時,Django將在question_text字段中進行搜索。 你在search_fields中使用任意數(shù)量的字段,但由于它在后臺使用LIKE進行查詢,盡量不要添加太多的字段,不然會降低數(shù)據(jù)庫查詢能力。

  修改列表自帶分頁功能,默認每頁展示100條數(shù)據(jù)。

自定義管理站點外觀

  很明顯,在每一個admin頁面坐上頂端都顯示“Django 管理”是感覺很荒誕,它僅僅是個占位文本。利用Django的模板系統(tǒng),可以易修改它。

  它可以用Django的模板系統(tǒng)輕松改變。 Django的管理站點是用Django自己制作出來的,它的界面代碼使用的是Django自己的模板系統(tǒng)。

自定義項目模板

  在項目的路勁下(包含manage.py的目錄)創(chuàng)建一個名為templates目錄。Templates可以放在你的文件系統(tǒng)中Django所能訪問到的任何地方。(運行Web服務(wù)器的用戶即是運行Django的用戶)。然而,但是作為一個好的習慣,最好把模板放在本項目目錄下。

  在配置文件中(mysite/settings.py)在TEMPLATES中添加一個DIRS選項:

# mysite/settings.pyTEMPLATES = [
    {'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

登錄后復制

  DIRS是在加載Django模板時檢查的文件系統(tǒng)目錄列表;它是一個搜索路徑。

模板組織方式:就像靜態(tài)文件一樣,我們可以把所有的模板都放在一起,形成一個大大的模板文件夾,并且工作正常。但是不建議這樣!最好每一個模板都應(yīng)該存放在它所屬應(yīng)用的模板目錄內(nèi)(例如polls/templates)而不是整個項目的模板目錄(templates),因為這樣每個應(yīng)用才可以被方便和正確的重用。請參考如何重用apps]()。

  接下來,在剛才創(chuàng)建的templates中創(chuàng)建一個admin目錄,將admin/base_site.html模板文件拷貝到該目錄內(nèi)。這個html文件來自Django源碼,它位于django/contrib/admin/templates目錄內(nèi)。

如何找到Django源文件: 在命令行中運行下面代碼: python -c "import django; print(django.__path__)"

  然后替換文件中的{{ site_header|default:_('Django administration') }}(包括兩個大括號),換成你想要命名的名字即可。編輯完成后應(yīng)該類似下面的代碼片段:

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
{% endblock %}

登錄后復制

  這里僅僅是使用這種方法來教您如何覆蓋模板。在實際的項目中,您可以使用django.contrib.admin.AdminSite。siteheader屬性更容易實現(xiàn)這個特殊的定制。

  在這個模板文件中有許多類似這樣的文本{% block branding %}{{ title }}{%{{都是Django模板語法的一部分。當Django渲染admin/base_site.html的時候,這個模板語言將被生成最終的html頁面,就像Part3中一樣。

  注意任何Django管理站點的默認模板都可以重寫。 想要重寫一個模板文件,只需要做和重寫base_site.html相同的操作就行——將它從默認的目錄拷貝到你自定義的目錄中,然后修改它。

自定義應(yīng)用模板

  聰明的讀者可能會問:但是DIRS默認是空的,Django是如何找到默認的admin模板呢?回答是,由于APP_DIRS被設(shè)置為`True``,Django將自動查找每一個應(yīng)用路徑下的templates/子目錄(不要忘了django.contrib.admin也是一個應(yīng)用)。

  我們的投票應(yīng)用不太復雜,因此不需要自定義admin模板。但是如果它變得越來越復雜,因為某些功能而需要修改Django的標準admin模板,那么修改的模板就比修改項目的模板更加明智。這樣的話,你可以將投票應(yīng)用加入到任何新的項目中,并且保證能夠找到它所需要的自定義模板。更多關(guān)于Django如何加載模板文件的信息,請查看模板加載 (0%)的文檔。

自定義管理站點首頁

  在類似的情況下,您可能想要定制Django管理首頁頁面。默認情況下,管理站點首頁顯示所有INSTALLED_APPS內(nèi)并在admin應(yīng)用中注冊過的app,以字母順序進行排序。

  要定制管理站點首頁,需要重寫admin/index.html模板,就像前面修改base_site.html模板的方法一樣,從源碼目錄拷貝到你指定的目錄內(nèi)。編輯該文件,你會看到文件內(nèi)使用了一個app_list模板變量。該變量包含了所有已經(jīng)安裝的Django應(yīng)用。你可以硬編碼鏈接到指定對象的admin頁面,使用任何你認為好的方法,用于替代這個app_list

快速通道

  • Django 1.10中文文檔-第一個應(yīng)用Part1-請求與響應(yīng)

  • Django 1.10中文文檔-第一個應(yīng)用Part2-模型和管理站點

  • Django 1.10中文文檔-第一個應(yīng)用Part3-視圖和模板

  • Django 1.10中文文檔-第一個應(yīng)用Part4-表單和通用視圖

  • Django 1.10中文文檔-第一個應(yīng)用Part5-測試

  • Django 1.10中文文檔-第一個應(yīng)用Part6-靜態(tài)文件

  • Django 1.10中文文檔-第一個應(yīng)用Part7-自定義管理站點

文檔地址

以上就是Django 1.10中文文檔-自定義管理站點的詳細內(nèi)容,更多請關(guān)注風君子博客其它相關(guān)文章!

總結(jié)

以上是生活随笔為你收集整理的Django 1.10中文文档-自定义管理站点(django)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。