django admin 使用SimpleUI自定義按鈕彈窗框示例
django admin 使用SimpleUI自定義按鈕彈窗框示例
actions = ['button_exeScript', ]
def button_exeScript(self, request, queryset):
pass
button_exeScript.layer = {
# 彈出層中的輸入框配置
# 這里指定對(duì)話框的標(biāo)題
'title': '彈出層輸入框',
# 提示信息
'tips': '這個(gè)彈出對(duì)話框是需要在admin中進(jìn)行定義,數(shù)據(jù)新增編輯等功能,需要自己來(lái)實(shí)現(xiàn)。',
# 確認(rèn)按鈕顯示文本
'confirm_button': '確認(rèn)提交',
# 取消按鈕顯示文本
'cancel_button': '取消',
# 彈出層對(duì)話框的寬度,默認(rèn)50%
'width': '40%',
# 表單中 label的寬度,對(duì)應(yīng)element-ui的 label-width,默認(rèn)80px
'labelWidth': "80px",
'params': [{
# 這里的type 對(duì)應(yīng)el-input的原生input屬性,默認(rèn)為input
'type': 'input',
# key 對(duì)應(yīng)post參數(shù)中的key
'key': 'name',
# 顯示的文本
'label': '名稱',
# 為空校驗(yàn),默認(rèn)為False
'require': True
}, {
'type': 'select',
'key': 'type',
'label': '類型',
'width': '200px',
# size對(duì)應(yīng)elementui的size,取值為:medium small mini
'size': 'small',
# value字段可以指定默認(rèn)值
'value': '0',
'options': [{
'key': '0',
'label': '收入'
}, {
'key': '1',
'label': '支出'
}]
}, {
'type': 'number',
'key': 'money',
'label': '金額',
# 設(shè)置默認(rèn)值
'value': 1000
}, {
'type': 'date',
'key': 'date',
'label': '日期',
}, {
'type': 'datetime',
'key': 'datetime',
'label': '時(shí)間',
}, {
'type': 'rate',
'key': 'star',
'label': '評(píng)價(jià)等級(jí)'
}, {
'type': 'color',
'key': 'color',
'label': '顏色'
}, {
'type': 'slider',
'key': 'slider',
'label': '滑塊'
}, {
'type': 'switch',
'key': 'switch',
'label': 'switch開關(guān)'
}, {
'type': 'input_number',
'key': 'input_number',
'label': 'input number'
}, {
'type': 'checkbox',
'key': 'checkbox',
# 必須指定默認(rèn)值
'value': [],
'label': '復(fù)選框',
'options': [{
'key': '0',
'label': '收入'
}, {
'key': '1',
'label': '支出'
}, {
'key': '2',
'label': '收益'
}]
}, {
'type': 'radio',
'key': 'radio',
'label': '單選框',
'options': [{
'key': '0',
'label': '收入'
}, {
'key': '1',
'label': '支出'
}, {
'key': '2',
'label': '收益'
}]
}]
}
展示如下:

補(bǔ)充:詳解Django admin高級(jí)用法
Django 后臺(tái)admin有大量的屬性和方法,擁有強(qiáng)大的功能和自定義能力.通過(guò)完整的代碼來(lái)看Django admin的基礎(chǔ)設(shè)置和高級(jí)用法,并結(jié)合form表單來(lái)實(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ù)庫(kù)" 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)入修改頁(yè)面,對(duì)應(yīng) change_form.html 模板.
自定義admin類
使用admin也可以自定義一個(gè)admin的類,來(lái)自定義后臺(tái)實(shí)現(xiàn)的屬性和方法,然后通過(guò) register() 來(lái)將自定義的類和模型注冊(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è)置在列表頁(yè)和詳情頁(yè)顯示的字段以及搜索字段等的限制,在admin的類中可以直接定義.
以使用較多的 ModelAdmin 為例, ModelAdmin 源碼中的屬性有:
# 在列表頁(yè)顯示的字段,默認(rèn)會(huì)顯示所有字段,有對(duì)應(yīng)的方法可以重寫
list_display = ('__str__',)
# 在列表頁(yè)顯示的字段中,可以鏈接到change_form頁(yè)面的字段
list_display_links = ()
# 右側(cè)的篩選,必須是字段,可以繼承自SimpleListFilter來(lái)自定義篩選字段和規(guī)則,SimpleListFilter的方法在后面詳細(xì)介紹
list_filter = ()
# 聯(lián)表查詢是否自動(dòng)查詢,可以是布爾,列表或元組,如果是列表或元組,則級(jí)聯(lián)查詢指定的字段
list_select_related = False
# 列表頁(yè)每頁(yè)展示的條數(shù)
list_per_page = 100
# 分頁(yè),顯示全部,真是數(shù)據(jù)小于該值時(shí)才會(huì)顯示全部
list_max_show_all = 200
# 在列表頁(yè)可以編輯的字段
list_editable = ()
# 在列表頁(yè)可以模糊搜索的字段
search_fields = ()
# 對(duì)Date和DateTime類型進(jìn)行搜索
date_hierarchy = None
# 在change_form頁(yè)面,按鈕為,save按鈕的值(save as new和save add another)
save_as = False
# 點(diǎn)擊保存并繼續(xù)編輯
save_as_continue = True
# save按鈕的位置,是True則顯示在頁(yè)面上方
save_on_top = False
# 自定義分頁(yè)類
paginator = Paginator
# 詳細(xì)頁(yè)面,刪除、修改,更新后跳轉(zhuǎn)回列表后,是否保留原搜索條件管理員現(xiàn)在在創(chuàng)建,編輯或刪除對(duì)象后保留列表視圖中的過(guò)濾器。
# 可以將此屬性設(shè)置為False,以恢復(fù)之前清除過(guò)濾器的行為。
preserve_filters = True
# 在詳情頁(yè)面,如果有FK到其他表,在詳情頁(yè)中可以動(dòng)態(tài)的填加或刪除級(jí)聯(lián)數(shù)據(jù)
inlines = []
admin中action操作的設(shè)置
admin中的action是指在列表頁(yè)的動(dòng)作,默認(rèn)為刪除所選的條目,可以自定義填加動(dòng)作,將動(dòng)作注冊(cè)到action中,需要是一個(gè)方法
# 定制action中的操作
actions = []
action_form = helpers.ActionForm
# action選項(xiàng)顯示的位置,頁(yè)面上方或者頁(yè)面下方
actions_on_top = True
actions_on_bottom = False
# 是否顯示action選擇的個(gè)數(shù)
actions_selection_counter = True
checks_class = ModelAdminChecks
baseModelAdmin中的屬性
除了ModelAdmin中的屬性,也可以自定義在其父類baseModelAdmin中的屬性和方法,是一些通用的,在繼承子baseModelAdmin的類中也可以完成的屬性設(shè)置.一般是詳情頁(yè)的屬性.
# 自動(dòng)補(bǔ)全,外鍵查詢數(shù)據(jù)多時(shí),方便查找
autocomplete_fields = ()
# 詳情頁(yè),針對(duì)外鍵和M2M字段變成input框形式
raw_id_fields = ()
# 詳情頁(yè)面展示的字段
fields = None
# 詳情頁(yè)面排除的字段,字段可以是數(shù)據(jù)庫(kù)中的也可以是自定義的
exclude = None
# 在詳情頁(yè)面對(duì)數(shù)據(jù)進(jìn)行分隔顯示,對(duì)應(yīng)到admin模板中的'fieldsets.html'
fieldsets = None
# 為詳情頁(yè)指定form表單,可以自定義顯示的數(shù)據(jù),字段
form = forms.ModelForm
# 下面兩個(gè)是M2M顯示時(shí),數(shù)據(jù)移動(dòng)選擇.可以參考admin中用戶的權(quán)限操作
filter_vertical = () # 縱向展示
filter_horizontal = () # 橫向展示
# 詳情頁(yè)面使用radio顯示選項(xiàng),FK默認(rèn)使用select
radio_fields = {}
# 填加頁(yè)面,在某字段輸入值后,自動(dòng)填加到指定字段
# prepopulated_fields = {"email": ("user",)},email字段會(huì)在用戶填加user字段時(shí)自動(dòng)填充
prepopulated_fields = {}
# 詳情頁(yè)指定顯示的插件,后面詳細(xì)說(shuō)明
formfield_overrides = {}
# 詳情頁(yè)面的只讀字段
readonly_fields = ()
# 詳情頁(yè)面排序規(guī)則
ordering = None
# 禁止某些排序,為空則禁止所有的排序
sortable_by = None
# 編輯時(shí)是否在頁(yè)面上顯示view on set,可以通過(guò)方法來(lái)返回一個(gè)鏈接,后面說(shuō)明
view_on_site = True
# 列表頁(yè),模糊搜索后面顯示的數(shù)據(jù)個(gè)數(shù)樣式
# 為True是顯示條數(shù),為False時(shí)顯示全部
show_full_result_count = True
checks_class = baseModelAdminChecks模板的定制
指定自定義模板
在ModelAdmin中自帶了幾個(gè)指定模板的屬性,可以自己定義HTML文件,來(lái)指定給某個(gè)模板頁(yè)面
# Custom templates (designed to be over-ridden in subclasses) # 添加數(shù)據(jù)模板頁(yè) add_form_template = None # 修改數(shù)據(jù)的模板頁(yè) change_form_template = None # 修改多條數(shù)據(jù)的模板頁(yè) change_list_template = None # 刪除確認(rèn)信息模板頁(yè) delete_/confirm/iation_template = None # 刪除關(guān)聯(lián)數(shù)據(jù)的確認(rèn)頁(yè) delete_selected_/confirm/iation_template = None # 修改歷史的模板頁(yè) object_history_template = None # 彈出框模板頁(yè) popup_response_template = None
重寫自帶模板
在django admin里面有自己寫好的模板,include模板,每個(gè)app也有對(duì)應(yīng)的模板
admin的自帶模板在項(xiàng)目的 django/contrib/admin/templates/admin ,目錄下面
include 文目錄下是 include 語(yǔ)法包含的模板。
change_form.html 是數(shù)據(jù)修改頁(yè)面的模板,如果想在數(shù)據(jù)詳情頁(yè)面自定義顯示的內(nèi)容,可以自定義這個(gè)頁(yè)面
模板使用的全都是模板語(yǔ)法,注意模板語(yǔ)法的繼承機(jī)制,在當(dāng)前頁(yè)面重寫的元素,不會(huì)直接顯示。
fieldset.htlm 是拼接成詳情頁(yè)的塊。前面提到,自定義admin類中的 fieldset 屬性,可以自定義詳情頁(yè),使數(shù)據(jù)字段分塊顯示,就是改變了傳給這個(gè)頁(yè)面的值。
例如,使用 if 語(yǔ)句來(lái)動(dòng)態(tài)添加jQuery和 div 標(biāo)簽,只有在訪問(wèn)某個(gè)app的數(shù)據(jù)時(shí)添加
結(jié)合form表單
django admin結(jié)合form表單,重寫 fieldset.html 來(lái)實(shí)現(xiàn)數(shù)據(jù)詳情頁(yè)面的深度自定義,通過(guò)處理form表單提交的數(shù)據(jù),來(lái)實(shí)現(xiàn)后臺(tái)功能的完全自定義。
django的admin中可以指定form類,來(lái)自定義顯示的內(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 屬性來(lái)控制需要顯示的表單
然后在admin中注冊(cè)form類
class CandidateTagAdmin(admin.ModelAdmin): ??list_display = [ ????'id', ????'tag_count', ??] ??form = CustomAddForm
自定義列表頁(yè)來(lái)源
除了可以通過(guò)修改admin的屬性,來(lái)實(shí)現(xiàn)列表頁(yè)展示字段的自定義,也可以對(duì)列表頁(yè)數(shù)據(jù)進(jìn)行篩選,例如,篩選出活躍的用戶等,這個(gè)可以在 action 中定義新的方法
也可以重寫admin中的 get_queryset 方法,返回的qs是重新篩選之后的數(shù)據(jù),可以避免一些業(yè)務(wù)邏輯上的誤操作
這里的代碼展示了,在列表頁(yè),展示其他表中的數(shù)據(jù),注冊(cè)模型表的數(shù)據(jù)沒(méi)有展示
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屬性之后,在詳情頁(yè)面?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)簽來(lái)確定修改的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ù)庫(kù)中生成的,實(shí)在模型類中定義的方法,這個(gè)方法的返回值,可以在列表頁(yè)中直接展示。例如上文中說(shuō)道的標(biāo)簽的個(gè)數(shù)
同時(shí),也可以返回一個(gè)HTML標(biāo)簽,模板語(yǔ)法中獲取這個(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 = '所屬部門'
到此這篇關(guān)于django admin 使用SimpleUI自定義按鈕彈窗框示例的文章就介紹到這了,更多相關(guān)django admin自定義按鈕彈窗框內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
uni-app實(shí)現(xiàn)微信小程序長(zhǎng)按拍視頻功能
這篇文章主要為大家詳細(xì)介紹了uni-app實(shí)現(xiàn)微信小程序長(zhǎng)按拍視頻功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
JS中跨頁(yè)面調(diào)用變量和函數(shù)的方法(例如a.js 和 b.js中互相調(diào)用)
下面小編就為大家?guī)?lái)一篇JS中跨頁(yè)面調(diào)用變量和函數(shù)的方法(例如a.js 和 b.js中互相調(diào)用)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
Bootstrap實(shí)現(xiàn)默認(rèn)導(dǎo)航欄效果
這篇文章主要介紹了Bootstrap實(shí)現(xiàn)默認(rèn)導(dǎo)航欄效果,導(dǎo)航欄是一個(gè)很好的功能,是Bootstrap網(wǎng)站的一個(gè)突出特點(diǎn),本文帶領(lǐng)大家學(xué)習(xí)實(shí)現(xiàn)Bootstrap導(dǎo)航欄,需要的朋友可以參考下2015-12-12
js中encode、decode的應(yīng)用說(shuō)明
這里簡(jiǎn)單介紹下js中的encode、decode的字符2012-10-10
JavaScript中for循環(huán)的幾種寫法與效率總結(jié)
每個(gè)接觸JS的開發(fā)人員都不可避免的與for循環(huán)打交道,畢竟這是遍歷必不可少的工具之一。然而當(dāng)循環(huán)次數(shù)比較大時(shí),效率問(wèn)題必須重視。下面這篇文章就主要介紹了JavaScript中幾種for循環(huán)的寫法與效率,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02
如何利用moment處理時(shí)間戳并計(jì)算時(shí)間的差值
前端很多場(chǎng)景都會(huì)涉及到對(duì)時(shí)間的處理,我所用得最多的庫(kù)是moment,下面這篇文章主要給大家介紹了關(guān)于如何利用moment處理時(shí)間戳并計(jì)算時(shí)間的差值的相關(guān)資料,需要的朋友可以參考下2022-04-04
老生常談document.ready和window.onload
這篇文章主要介紹了document.ready和window.onload的相關(guān)知識(shí),包括document.ready和window.onload的區(qū)別,要使用document.ready()或者document.onload()的原因分析,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-01-01
layer彈出的iframe層在執(zhí)行完畢后關(guān)閉當(dāng)前彈出層的方法
今天小編就為大家分享一篇layer彈出的iframe層在執(zhí)行完畢后關(guān)閉當(dāng)前彈出層的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08

