欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Django admin高級(jí)用法

 更新時(shí)間:2019年11月06日 14:56:04   作者:belingud  
這篇文章主要介紹了Django admin高級(jí)用法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

使用Django意味著后臺(tái)框架的幾乎所有內(nèi)容都會(huì)和Django產(chǎn)生互動(dòng),排除功能全部手?jǐn)]的情況.

Django 后臺(tái)admin有大量的屬性和方法,擁有強(qiáng)大的功能和自定義能力.通過完整的代碼來看Django admin的基礎(chǔ)設(shè)置和高級(jí)用法,并結(jié)合form表單來實(shí)現(xiàn)深度自定義.

簡(jiǎn)單使用

如果只是使用admin自帶的數(shù)據(jù)管理功能,只需要將模型注冊(cè)到admin中,就可以實(shí)現(xiàn).

from django.contrib import admin
admin.site.register(News)
admin.site.register(NewsType)
admin.site.site_header = "數(shù)據(jù)庫"
admin.site.index_title = "新聞后臺(tái)"

Django后臺(tái)會(huì)將對(duì)應(yīng)數(shù)據(jù)表的所有字段進(jìn)行展示,默認(rèn)點(diǎn)擊 id 會(huì)進(jìn)入修改頁面,對(duì)應(yīng) change_form.html 模板.

自定義admin類

使用admin也可以自定義一個(gè)admin的類,來自定義后臺(tái)實(shí)現(xiàn)的屬性和方法,然后通過 register() 來將自定義的類和模型注冊(cè)在一起.

注冊(cè)方式有兩種,一種是使用類裝飾器,一種是使用 site

from django.contrib import admin
# 裝飾器注冊(cè)
@admin.register(ModelClass)
class CustomAdmin(admin.ModelAdmin):
  list_display = '__all__'
# 使用site
class CustomAdmin(admin.ModelAdmin):
  exclude = ['id']
admin.site.register(CustomAdmin, ModelClass)

admin顯示屬性的設(shè)置

ModelAdmin中的屬性設(shè)置

admin可以設(shè)置在列表頁和詳情頁顯示的字段以及搜索字段等的限制,在admin的類中可以直接定義.

以使用較多的 ModelAdmin 為例, ModelAdmin 源碼中的屬性有:

# 在列表頁顯示的字段,默認(rèn)會(huì)顯示所有字段,有對(duì)應(yīng)的方法可以重寫
list_display = ('__str__',)
# 在列表頁顯示的字段中,可以鏈接到change_form頁面的字段
list_display_links = ()
# 右側(cè)的篩選,必須是字段,可以繼承自SimpleListFilter來自定義篩選字段和規(guī)則,SimpleListFilter的方法在后面詳細(xì)介紹
list_filter = ()
# 聯(lián)表查詢是否自動(dòng)查詢,可以是布爾,列表或元組,如果是列表或元組,則級(jí)聯(lián)查詢指定的字段
list_select_related = False
# 列表頁每頁展示的條數(shù)
list_per_page = 100
# 分頁,顯示全部,真是數(shù)據(jù)小于該值時(shí)才會(huì)顯示全部
list_max_show_all = 200
# 在列表頁可以編輯的字段
list_editable = ()
# 在列表頁可以模糊搜索的字段
search_fields = ()
# 對(duì)Date和DateTime類型進(jìn)行搜索
date_hierarchy = None
# 在change_form頁面,按鈕為,save按鈕的值(save as new和save add another)
save_as = False
# 點(diǎn)擊保存并繼續(xù)編輯
save_as_continue = True
# save按鈕的位置,是True則顯示在頁面上方
save_on_top = False
# 自定義分頁類
paginator = Paginator
# 詳細(xì)頁面,刪除、修改,更新后跳轉(zhuǎn)回列表后,是否保留原搜索條件管理員現(xiàn)在在創(chuàng)建,編輯或刪除對(duì)象后保留列表視圖中的過濾器。
# 可以將此屬性設(shè)置為False,以恢復(fù)之前清除過濾器的行為。
preserve_filters = True
# 在詳情頁面,如果有FK到其他表,在詳情頁中可以動(dòng)態(tài)的填加或刪除級(jí)聯(lián)數(shù)據(jù)
inlines = []
admin中action操作的設(shè)置
admin中的action是指在列表頁的動(dòng)作,默認(rèn)為刪除所選的條目,可以自定義填加動(dòng)作,將動(dòng)作注冊(cè)到action中,需要是一個(gè)方法
# 定制action中的操作
actions = []
action_form = helpers.ActionForm
# action選項(xiàng)顯示的位置,頁面上方或者頁面下方
actions_on_top = True
actions_on_bottom = False
# 是否顯示action選擇的個(gè)數(shù)
actions_selection_counter = True
checks_class = ModelAdminChecks
BaseModelAdmin中的屬性
除了ModelAdmin中的屬性,也可以自定義在其父類BaseModelAdmin中的屬性和方法,是一些通用的,在繼承子BaseModelAdmin的類中也可以完成的屬性設(shè)置.一般是詳情頁的屬性.
# 自動(dòng)補(bǔ)全,外鍵查詢數(shù)據(jù)多時(shí),方便查找
autocomplete_fields = ()
# 詳情頁,針對(duì)外鍵和M2M字段變成input框形式
raw_id_fields = ()
# 詳情頁面展示的字段
fields = None
# 詳情頁面排除的字段,字段可以是數(shù)據(jù)庫中的也可以是自定義的
exclude = None
# 在詳情頁面對(duì)數(shù)據(jù)進(jìn)行分隔顯示,對(duì)應(yīng)到admin模板中的'fieldsets.html'
fieldsets = None
# 為詳情頁指定form表單,可以自定義顯示的數(shù)據(jù),字段
form = forms.ModelForm
# 下面兩個(gè)是M2M顯示時(shí),數(shù)據(jù)移動(dòng)選擇.可以參考admin中用戶的權(quán)限操作
filter_vertical = () # 縱向展示
filter_horizontal = () # 橫向展示
# 詳情頁面使用radio顯示選項(xiàng),FK默認(rèn)使用select
radio_fields = {}
# 填加頁面,在某字段輸入值后,自動(dòng)填加到指定字段
# prepopulated_fields = {"email": ("user",)},email字段會(huì)在用戶填加user字段時(shí)自動(dòng)填充
prepopulated_fields = {}
# 詳情頁指定顯示的插件,后面詳細(xì)說明
formfield_overrides = {}
# 詳情頁面的只讀字段
readonly_fields = ()
# 詳情頁面排序規(guī)則
ordering = None
# 禁止某些排序,為空則禁止所有的排序
sortable_by = None
# 編輯時(shí)是否在頁面上顯示view on set,可以通過方法來返回一個(gè)鏈接,后面說明
view_on_site = True
# 列表頁,模糊搜索后面顯示的數(shù)據(jù)個(gè)數(shù)樣式
# 為True是顯示條數(shù),為False時(shí)顯示全部
show_full_result_count = True
checks_class = BaseModelAdminChecks

模板的定制

指定自定義模板

在ModelAdmin中自帶了幾個(gè)指定模板的屬性,可以自己定義HTML文件,來指定給某個(gè)模板頁面

# Custom templates (designed to be over-ridden in subclasses)
# 添加數(shù)據(jù)模板頁
add_form_template = None
# 修改數(shù)據(jù)的模板頁
change_form_template = None
# 修改多條數(shù)據(jù)的模板頁
change_list_template = None
# 刪除確認(rèn)信息模板頁
delete_confirmation_template = None
# 刪除關(guān)聯(lián)數(shù)據(jù)的確認(rèn)頁
delete_selected_confirmation_template = None
# 修改歷史的模板頁
object_history_template = None
# 彈出框模板頁
popup_response_template = None

重寫自帶模板

在django admin里面有自己寫好的模板,include模板,每個(gè)app也有對(duì)應(yīng)的模板

admin的自帶模板在項(xiàng)目的 django/contrib/admin/templates/admin ,目錄下面

include 文目錄下是 include 語法包含的模板。

change_form.html 是數(shù)據(jù)修改頁面的模板,如果想在數(shù)據(jù)詳情頁面自定義顯示的內(nèi)容,可以自定義這個(gè)頁面

模板使用的全都是模板語法,注意模板語法的繼承機(jī)制,在當(dāng)前頁面重寫的元素,不會(huì)直接顯示。

fieldset.htlm 是拼接成詳情頁的塊。前面提到,自定義admin類中的 fieldset 屬性,可以自定義詳情頁,使數(shù)據(jù)字段分塊顯示,就是改變了傳給這個(gè)頁面的值。

例如,使用 if 語句來動(dòng)態(tài)添加jQuery和 div 標(biāo)簽,只有在訪問某個(gè)app的數(shù)據(jù)時(shí)添加

{% if app_name in request.path %}
  <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"></script>
<div>
<fieldset class="custom">

<div id="div"></div>
</fieldset>
{% endif %}

結(jié)合form表單

django admin結(jié)合form表單,重寫 fieldset.html 來實(shí)現(xiàn)數(shù)據(jù)詳情頁面的深度自定義,通過處理form表單提交的數(shù)據(jù),來實(shí)現(xiàn)后臺(tái)功能的完全自定義。

django的admin中可以指定form類,來自定義顯示的內(nèi)容

from django import forms
# TagValueManager是自定義的類
from tag_manager import TagValueManager

class CustomAddForm(forms.ModelForm):

  """ 根據(jù)標(biāo)簽的id,動(dòng)態(tài)生成下拉選項(xiàng)框 """
  for i in TagValueManager.all_tag:
    locals()[
      'field_tag_id_{}'.format(
        i['id'])] = forms.ChoiceField(
      choices=TagValueManager.get_choice(
        i['id']),
      label=i['name'])

  class Meta:
    model = CandidateTag
    fields = '__all__'
    exclude = ['tag_id', 'tag_value', 'ext_1', 'ext_2', 'candidate_id']

注意:在form表單中動(dòng)態(tài)生成的屬性,必須使用 fields='__all__‘ 屬性,否則不會(huì)顯示,可以結(jié)合 exclude 屬性來控制需要顯示的表單

然后在admin中注冊(cè)form類

class CandidateTagAdmin(admin.ModelAdmin):
  list_display = [
    'id',
    'tag_count',
  ]
  form = CustomAddForm

自定義列表頁來源

除了可以通過修改admin的屬性,來實(shí)現(xiàn)列表頁展示字段的自定義,也可以對(duì)列表頁數(shù)據(jù)進(jìn)行篩選,例如,篩選出活躍的用戶等,這個(gè)可以在 action 中定義新的方法

也可以重寫admin中的 get_queryset 方法,返回的qs是重新篩選之后的數(shù)據(jù),可以避免一些業(yè)務(wù)邏輯上的誤操作

這里的代碼展示了,在列表頁,展示其他表中的數(shù)據(jù),注冊(cè)模型表的數(shù)據(jù)沒有展示

def get_queryset(self, request):
    """
    從candidate表中查詢數(shù)據(jù),在list_display中統(tǒng)計(jì)其標(biāo)簽個(gè)數(shù)
    """
    qs = Candidate.objects.all().order_by('id')
    return qs
## 處理form數(shù)據(jù)

給admin類定義form屬性之后,在詳情頁面?zhèn)骰氐臄?shù)據(jù),會(huì)帶上form表單里面的數(shù)據(jù),然后結(jié)合業(yè)務(wù)邏輯處理這個(gè)數(shù)據(jù)

例如,業(yè)務(wù)場(chǎng)景,接受form數(shù)據(jù),保存到其他幾張表,對(duì)于展示數(shù)據(jù)的表,不進(jìn)行任何操作,那就需要重寫 save_model 方法,這個(gè)方法調(diào)用了模型的 save 方法

重寫這個(gè)方法:

def save_model(self, request, obj, form, change):
    """
    重寫save_model方法
    """
    candidate_id = request.path.split('/')[4]
    post_dict = request.POST
    # 根據(jù)返回的form表單的標(biāo)簽來確定修改的tag_id
    include_field = 'field_tag_id_'
    for key, value in post_dict.items():
      if include_field in key:
        tag_id = key.split('_')[-1]
        tag_value = value
        try:
          obj, created = CandidateTag.objects.update_or_create(
            defaults={'tag_value': tag_value}, candidate_id=candidate_id, tag_id=tag_id)
        except Exception as e:
          tag_name = TagValueManager.all_tag.get(id=tag_id)['name']
          messages.add_message(request, messages.ERROR, '求職者的"{}"標(biāo)簽信息保存失敗'.format(tag_name))

擴(kuò)展

在 get_queryset 方法中,展示類模型中的統(tǒng)計(jì)數(shù)據(jù),這個(gè)統(tǒng)計(jì)數(shù)據(jù),不是在數(shù)據(jù)庫中生成的,實(shí)在模型類中定義的方法,這個(gè)方法的返回值,可以在列表頁中直接展示。例如上文中說道的標(biāo)簽的個(gè)數(shù)

同時(shí),也可以返回一個(gè)HTML標(biāo)簽,模板語法中獲取這個(gè)字段時(shí),得到的是一個(gè)HTML標(biāo)簽,直接渲染

from django.utils.safestring import mark_safe
# 使用mark_safe
@mark_safe
def get_user_dept(self,obj):
  """ 這個(gè)方法在模型中 """
  return "<p>this is a HTML tag</p>"
# 允許HTML標(biāo)簽
get_report_depts.allow_tags = True
# HTML展示時(shí)的字段名
get_report_depts.short_description = '所屬部門'

總結(jié)

以上所述是小編給大家介紹的Django admin高級(jí)用法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • python 一維二維插值實(shí)例

    python 一維二維插值實(shí)例

    這篇文章主要介紹了python 一維二維插值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 列舉Python中吸引人的一些特性

    列舉Python中吸引人的一些特性

    這篇文章主要介紹了Python中吸引人的一些特性,有助于初學(xué)者或者開發(fā)者在選擇編程語言時(shí)用作參考或入門指引,需要的朋友可以參考下
    2015-04-04
  • python十進(jìn)制轉(zhuǎn)二進(jìn)制的詳解

    python十進(jìn)制轉(zhuǎn)二進(jìn)制的詳解

    在本篇文章里小編給大家整理了關(guān)于python十進(jìn)制轉(zhuǎn)二進(jìn)制的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以參考學(xué)習(xí)下。
    2020-02-02
  • python實(shí)現(xiàn)線程池的方法

    python實(shí)現(xiàn)線程池的方法

    這篇文章主要介紹了python實(shí)現(xiàn)線程池的方法,實(shí)例分析了Python線程池的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • python 正則表達(dá)式如何實(shí)現(xiàn)重疊匹配

    python 正則表達(dá)式如何實(shí)現(xiàn)重疊匹配

    這篇文章主要介紹了python 正則表達(dá)式如何實(shí)現(xiàn)重疊匹配,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • PyTorch高級(jí)教程之自定義模型、數(shù)據(jù)加載及設(shè)備間數(shù)據(jù)移動(dòng)

    PyTorch高級(jí)教程之自定義模型、數(shù)據(jù)加載及設(shè)備間數(shù)據(jù)移動(dòng)

    在深入理解了PyTorch的核心組件之后,我們將進(jìn)一步學(xué)習(xí)一些高級(jí)主題,包括如何自定義模型、加載自定義數(shù)據(jù)集,以及如何在設(shè)備(例如CPU和GPU)之間移動(dòng)數(shù)據(jù),需要的朋友可以參考下
    2023-07-07
  • Python實(shí)現(xiàn)圖片格式轉(zhuǎn)換

    Python實(shí)現(xiàn)圖片格式轉(zhuǎn)換

    經(jīng)常會(huì)遇到圖片格式需要轉(zhuǎn)換的情況,這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)圖片格式轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì)、實(shí)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 基于PyQt5制作一個(gè)動(dòng)態(tài)指針時(shí)鐘

    基于PyQt5制作一個(gè)動(dòng)態(tài)指針時(shí)鐘

    這篇文章主要和大家分享如何利用Python中的PyQt5制作一個(gè)動(dòng)態(tài)指針時(shí)鐘來顯示實(shí)時(shí)時(shí)間,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-02-02
  • Python利用Nagios增加微信報(bào)警通知的功能

    Python利用Nagios增加微信報(bào)警通知的功能

    Nagios是一款開源的免費(fèi)網(wǎng)絡(luò)監(jiān)視工具,能有效監(jiān)控Windows、Linux和Unix的主機(jī)狀態(tài),交換機(jī)路由器等網(wǎng)絡(luò)設(shè)置,打印機(jī)等,本文給大家介紹Python利用Nagios增加微信報(bào)警通知的功能,需要的朋友參考下
    2016-02-02
  • Pycharm及python安裝詳細(xì)教程(圖解)

    Pycharm及python安裝詳細(xì)教程(圖解)

    這篇文章主要介紹了Pycharm及python安裝詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-07-07

最新評(píng)論