django admin 使用SimpleUI自定義按鈕彈窗框示例
django admin 使用SimpleUI自定義按鈕彈窗框示例
actions = ['button_exeScript', ] def button_exeScript(self, request, queryset): pass button_exeScript.layer = { # 彈出層中的輸入框配置 # 這里指定對話框的標題 'title': '彈出層輸入框', # 提示信息 'tips': '這個彈出對話框是需要在admin中進行定義,數(shù)據(jù)新增編輯等功能,需要自己來實現(xiàn)。', # 確認按鈕顯示文本 'confirm_button': '確認提交', # 取消按鈕顯示文本 'cancel_button': '取消', # 彈出層對話框的寬度,默認50% 'width': '40%', # 表單中 label的寬度,對應(yīng)element-ui的 label-width,默認80px 'labelWidth': "80px", 'params': [{ # 這里的type 對應(yīng)el-input的原生input屬性,默認為input 'type': 'input', # key 對應(yīng)post參數(shù)中的key 'key': 'name', # 顯示的文本 'label': '名稱', # 為空校驗,默認為False 'require': True }, { 'type': 'select', 'key': 'type', 'label': '類型', 'width': '200px', # size對應(yīng)elementui的size,取值為:medium small mini 'size': 'small', # value字段可以指定默認值 'value': '0', 'options': [{ 'key': '0', 'label': '收入' }, { 'key': '1', 'label': '支出' }] }, { 'type': 'number', 'key': 'money', 'label': '金額', # 設(shè)置默認值 'value': 1000 }, { 'type': 'date', 'key': 'date', 'label': '日期', }, { 'type': 'datetime', 'key': 'datetime', 'label': '時間', }, { 'type': 'rate', 'key': 'star', 'label': '評價等級' }, { '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', # 必須指定默認值 'value': [], 'label': '復選框', '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': '收益' }] }] }
展示如下:
補充:詳解Django admin高級用法
Django 后臺admin有大量的屬性和方法,擁有強大的功能和自定義能力.通過完整的代碼來看Django admin的基礎(chǔ)設(shè)置和高級用法,并結(jié)合form表單來實現(xiàn)深度自定義.
簡單使用
如果只是使用admin自帶的數(shù)據(jù)管理功能,只需要將模型注冊到admin中,就可以實現(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 = "新聞后臺"
Django后臺會將對應(yīng)數(shù)據(jù)表的所有字段進行展示,默認點擊 id 會進入修改頁面,對應(yīng) change_form.html 模板.
自定義admin類
使用admin也可以自定義一個admin的類,來自定義后臺實現(xiàn)的屬性和方法,然后通過 register() 來將自定義的類和模型注冊在一起.
注冊方式有兩種,一種是使用類裝飾器,一種是使用 site
from django.contrib import admin # 裝飾器注冊 @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 源碼中的屬性有:
# 在列表頁顯示的字段,默認會顯示所有字段,有對應(yīng)的方法可以重寫 list_display = ('__str__',) # 在列表頁顯示的字段中,可以鏈接到change_form頁面的字段 list_display_links = () # 右側(cè)的篩選,必須是字段,可以繼承自SimpleListFilter來自定義篩選字段和規(guī)則,SimpleListFilter的方法在后面詳細介紹 list_filter = () # 聯(lián)表查詢是否自動查詢,可以是布爾,列表或元組,如果是列表或元組,則級聯(lián)查詢指定的字段 list_select_related = False # 列表頁每頁展示的條數(shù) list_per_page = 100 # 分頁,顯示全部,真是數(shù)據(jù)小于該值時才會顯示全部 list_max_show_all = 200 # 在列表頁可以編輯的字段 list_editable = () # 在列表頁可以模糊搜索的字段 search_fields = () # 對Date和DateTime類型進行搜索 date_hierarchy = None # 在change_form頁面,按鈕為,save按鈕的值(save as new和save add another) save_as = False # 點擊保存并繼續(xù)編輯 save_as_continue = True # save按鈕的位置,是True則顯示在頁面上方 save_on_top = False # 自定義分頁類 paginator = Paginator # 詳細頁面,刪除、修改,更新后跳轉(zhuǎn)回列表后,是否保留原搜索條件管理員現(xiàn)在在創(chuàng)建,編輯或刪除對象后保留列表視圖中的過濾器。 # 可以將此屬性設(shè)置為False,以恢復之前清除過濾器的行為。 preserve_filters = True # 在詳情頁面,如果有FK到其他表,在詳情頁中可以動態(tài)的填加或刪除級聯(lián)數(shù)據(jù) inlines = [] admin中action操作的設(shè)置 admin中的action是指在列表頁的動作,默認為刪除所選的條目,可以自定義填加動作,將動作注冊到action中,需要是一個方法 # 定制action中的操作 actions = [] action_form = helpers.ActionForm # action選項顯示的位置,頁面上方或者頁面下方 actions_on_top = True actions_on_bottom = False # 是否顯示action選擇的個數(shù) actions_selection_counter = True checks_class = ModelAdminChecks baseModelAdmin中的屬性 除了ModelAdmin中的屬性,也可以自定義在其父類baseModelAdmin中的屬性和方法,是一些通用的,在繼承子baseModelAdmin的類中也可以完成的屬性設(shè)置.一般是詳情頁的屬性. # 自動補全,外鍵查詢數(shù)據(jù)多時,方便查找 autocomplete_fields = () # 詳情頁,針對外鍵和M2M字段變成input框形式 raw_id_fields = () # 詳情頁面展示的字段 fields = None # 詳情頁面排除的字段,字段可以是數(shù)據(jù)庫中的也可以是自定義的 exclude = None # 在詳情頁面對數(shù)據(jù)進行分隔顯示,對應(yīng)到admin模板中的'fieldsets.html' fieldsets = None # 為詳情頁指定form表單,可以自定義顯示的數(shù)據(jù),字段 form = forms.ModelForm # 下面兩個是M2M顯示時,數(shù)據(jù)移動選擇.可以參考admin中用戶的權(quán)限操作 filter_vertical = () # 縱向展示 filter_horizontal = () # 橫向展示 # 詳情頁面使用radio顯示選項,FK默認使用select radio_fields = {} # 填加頁面,在某字段輸入值后,自動填加到指定字段 # prepopulated_fields = {"email": ("user",)},email字段會在用戶填加user字段時自動填充 prepopulated_fields = {} # 詳情頁指定顯示的插件,后面詳細說明 formfield_overrides = {} # 詳情頁面的只讀字段 readonly_fields = () # 詳情頁面排序規(guī)則 ordering = None # 禁止某些排序,為空則禁止所有的排序 sortable_by = None # 編輯時是否在頁面上顯示view on set,可以通過方法來返回一個鏈接,后面說明 view_on_site = True # 列表頁,模糊搜索后面顯示的數(shù)據(jù)個數(shù)樣式 # 為True是顯示條數(shù),為False時顯示全部 show_full_result_count = True checks_class = baseModelAdminChecks
模板的定制
指定自定義模板
在ModelAdmin中自帶了幾個指定模板的屬性,可以自己定義HTML文件,來指定給某個模板頁面
# 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 # 刪除確認信息模板頁 delete_/confirm/iation_template = None # 刪除關(guān)聯(lián)數(shù)據(jù)的確認頁 delete_selected_/confirm/iation_template = None # 修改歷史的模板頁 object_history_template = None # 彈出框模板頁 popup_response_template = None
重寫自帶模板
在django admin里面有自己寫好的模板,include模板,每個app也有對應(yīng)的模板
admin的自帶模板在項目的 django/contrib/admin/templates/admin ,目錄下面
include 文目錄下是 include 語法包含的模板。
change_form.html 是數(shù)據(jù)修改頁面的模板,如果想在數(shù)據(jù)詳情頁面自定義顯示的內(nèi)容,可以自定義這個頁面
模板使用的全都是模板語法,注意模板語法的繼承機制,在當前頁面重寫的元素,不會直接顯示。
fieldset.htlm 是拼接成詳情頁的塊。前面提到,自定義admin類中的 fieldset 屬性,可以自定義詳情頁,使數(shù)據(jù)字段分塊顯示,就是改變了傳給這個頁面的值。
例如,使用 if 語句來動態(tài)添加jQuery和 div 標簽,只有在訪問某個app的數(shù)據(jù)時添加
結(jié)合form表單
django admin結(jié)合form表單,重寫 fieldset.html 來實現(xiàn)數(shù)據(jù)詳情頁面的深度自定義,通過處理form表單提交的數(shù)據(jù),來實現(xiàn)后臺功能的完全自定義。
django的admin中可以指定form類,來自定義顯示的內(nèi)容
from django import forms # TagValueManager是自定義的類 from tag_manager import TagValueManager class CustomAddForm(forms.ModelForm): ??""" 根據(jù)標簽的id,動態(tài)生成下拉選項框 """ ??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表單中動態(tài)生成的屬性,必須使用 fields='__all__‘ 屬性,否則不會顯示,可以結(jié)合 exclude 屬性來控制需要顯示的表單
然后在admin中注冊form類
class CandidateTagAdmin(admin.ModelAdmin): ??list_display = [ ????'id', ????'tag_count', ??] ??form = CustomAddForm
自定義列表頁來源
除了可以通過修改admin的屬性,來實現(xiàn)列表頁展示字段的自定義,也可以對列表頁數(shù)據(jù)進行篩選,例如,篩選出活躍的用戶等,這個可以在 action 中定義新的方法
也可以重寫admin中的 get_queryset 方法,返回的qs是重新篩選之后的數(shù)據(jù),可以避免一些業(yè)務(wù)邏輯上的誤操作
這里的代碼展示了,在列表頁,展示其他表中的數(shù)據(jù),注冊模型表的數(shù)據(jù)沒有展示
def get_queryset(self, request): ????""" ????從candidate表中查詢數(shù)據(jù),在list_display中統(tǒng)計其標簽個數(shù) ????""" ????qs = Candidate.objects.all().order_by('id') ????return qs ##?處理form數(shù)據(jù)
給admin類定義form屬性之后,在詳情頁面?zhèn)骰氐臄?shù)據(jù),會帶上form表單里面的數(shù)據(jù),然后結(jié)合業(yè)務(wù)邏輯處理這個數(shù)據(jù)
例如,業(yè)務(wù)場景,接受form數(shù)據(jù),保存到其他幾張表,對于展示數(shù)據(jù)的表,不進行任何操作,那就需要重寫 save_model 方法,這個方法調(diào)用了模型的 save 方法
重寫這個方法:
def save_model(self, request, obj, form, change): ????""" ????重寫save_model方法 ????""" ????candidate_id = request.path.split('/')[4] ????post_dict = request.POST ????# 根據(jù)返回的form表單的標簽來確定修改的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, '求職者的"{}"標簽信息保存失敗'.format(tag_name))
擴展
在 get_queryset 方法中,展示類模型中的統(tǒng)計數(shù)據(jù),這個統(tǒng)計數(shù)據(jù),不是在數(shù)據(jù)庫中生成的,實在模型類中定義的方法,這個方法的返回值,可以在列表頁中直接展示。例如上文中說道的標簽的個數(shù)
同時,也可以返回一個HTML標簽,模板語法中獲取這個字段時,得到的是一個HTML標簽,直接渲染
from django.utils.safestring import mark_safe # 使用mark_safe @mark_safe def get_user_dept(self,obj): ??""" 這個方法在模型中 """ ??return "<p>this is a HTML tag</p>" # 允許HTML標簽 get_report_depts.allow_tags = True # HTML展示時的字段名 get_report_depts.short_description = '所屬部門'
到此這篇關(guān)于django admin 使用SimpleUI自定義按鈕彈窗框示例的文章就介紹到這了,更多相關(guān)django admin自定義按鈕彈窗框內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ionic2自定義cordova插件開發(fā)以及使用(Android)
這篇文章主要為大家詳細介紹了ionic2自定義cordova插件開發(fā)以及使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06實用又漂亮的BootstrapValidator表單驗證插件
這篇文章主要為大家詳細介紹了好用又漂亮的BootstrapValidator表單驗證插件,感興趣的小伙伴們可以參考一下2016-05-05Bootstrap Table 在指定列中添加下拉框控件并獲取所選值
通過 bootstrap-table 的Column 配置項中的formatter,將獲取到的數(shù)據(jù)轉(zhuǎn)換為包含數(shù)據(jù)的 select 控件。然后根據(jù)用戶選擇項更新對應(yīng)單元格數(shù)據(jù),最后通過getallselection方法獲取所選行數(shù)據(jù)2017-07-07