Django中的admin自定制相關(guān)

Django admin是Django 提供的基于 web 的管理工具扼鞋。Django 自動(dòng)管理工具是 django.contrib 的一部分蘑志。你可以在項(xiàng)目的 settings.py 中的 INSTALLED_APPS 看到它穗泵。django.contrib是一套龐大的功能集瓮孙,它是Django基本代碼的組成部分坊秸。

Django內(nèi)置的Admin是對(duì)于model中對(duì)應(yīng)的數(shù)據(jù)表進(jìn)行增刪改查提供的組件麸祷。

admin的內(nèi)部依賴(lài):
    依賴(lài)APP:
        django.contrib.auth
        django.contrib.contenttypes
        django.contrib.messages
        django.contrib.sessions

    模板的context_processors:
        django.contrib.auth.context_processors.auth
        django.contrib.messages.context_processors.messages

    中間件:
        django.contrib.auth.middleware.AuthenticationMiddleware 
        django.contrib.messages.middleware.MessageMiddleware

一、定制admin

  • 在admin.py中只需要將Mode中的某個(gè)類(lèi)注冊(cè)一下褒搔,即可在Admin中實(shí)現(xiàn)增刪改查的功能阶牍,注冊(cè)規(guī)則如下:
from django.contrib import admin
from app import models
admin.site.register(models.UserInfo)
  • 以上這種方式比較簡(jiǎn)單喷面,如果想要進(jìn)行更多的定制操作,需要利用ModelAdmin進(jìn)行操作走孽,如下:
方式一:
    class UserAdmin(admin.ModelAdmin):#必須繼承admin.ModelAdmin
        pass 
    admin.site.register(models.UserInfo, UserAdmin)  # 第一個(gè)參數(shù)可以是列表
      
方式二:
    @admin.register(models.UserInfo) # 第一個(gè)參數(shù)可以是列表
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd',)

二惧辈、 ModelAdmin中提供的可定制功能簡(jiǎn)單示例

  • list_display,列表或元組內(nèi)的元素是Model中的字符串類(lèi)型的字段磕瓷,定制顯示的列盒齿。
class UserInfo(admin.ModelAdmin):
   list_display = ("username","phone","email")

admin.site.register(models.UserInfo,UserInfo)
  • list_display_links,列表或元組內(nèi)的元素是Model中的字符串類(lèi)型的字段困食,定制列可以點(diǎn)擊跳轉(zhuǎn)边翁。
class UserInfo(admin.ModelAdmin):
    list_display = ("username","phone","email")
    list_display_links = ['username','phone','email']
admin.site.register(models.UserInfo,UserInfo)
  • list_filter,定制右側(cè)快速篩選硕盹。
class UserInfo(admin.ModelAdmin):
    list_display = ("username","phone","email")
    list_display_links = ['username','phone','email']
    list_filter = ['username','phone']#一般列表里面存放的字段都是一對(duì)多的字段符匾,要不然就沒(méi)什么意義了

admin.site.register(models.UserInfo,UserInfo)
  • search_fields,模糊搜索的功能
class UserInfo(admin.ModelAdmin):
    list_display = ("username","phone","email")
    list_display_links = ['username','phone','email']
    list_filter = ['username','phone']#一般列表里面存放的字段都是一對(duì)多的字段瘩例,要不然就沒(méi)什么意義了
    search_fields = ["username",'phone']

admin.site.register(models.UserInfo,UserInfo)
  • action啊胶,定制action中的操作
class ArticleAction(admin.ModelAdmin):

    def func(self, request, queryset):
        queryset.delete()

    func.short_description = "快捷刪除選中項(xiàng)"
    actions = [func, ]
    # Action選項(xiàng)都是在頁(yè)面上方顯示
    actions_on_top = True
    # Action選項(xiàng)都是在頁(yè)面下方顯示
    actions_on_bottom = False
    # 是否顯示選擇個(gè)數(shù)
    actions_selection_counter = True

admin.site.register(models.Article,ArticleAction)
  • list_select_related,連表查詢(xún)是否自動(dòng)select_related,對(duì)應(yīng)的值是Ture或False
  • 分頁(yè)相關(guān)
# 分頁(yè)垛贤,每頁(yè)顯示條數(shù)
    list_per_page = 100
 
# 分頁(yè)焰坪,顯示全部(真實(shí)數(shù)據(jù)<該值時(shí),才會(huì)有顯示全部)
    list_max_show_all = 200
 
# 分頁(yè)插件
    paginator = Paginator
  • date_hierarchy聘惦,對(duì)Date和DateTime類(lèi)型進(jìn)行搜索
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    date_hierarchy = 'ctime'
  • preserve_filters某饰,詳細(xì)頁(yè)面,刪除部凑、修改露乏,更新后跳轉(zhuǎn)回列表后,是否保留原搜索條件
  • save_as = False涂邀,詳細(xì)頁(yè)面瘟仿,按鈕為“Sava as new” 或 “Sava and add another”
  • save_as_continue = True,點(diǎn)擊保存并繼續(xù)編輯
save_as_continue = True
 
# 如果 save_as=True比勉,save_as_continue = True劳较, 點(diǎn)擊Sava as new 按鈕后繼續(xù)編輯。
# 如果 save_as=True浩聋,save_as_continue = False观蜗,點(diǎn)擊Sava as new 按鈕后返回列表。
 
New in Django 1.10.
  • save_on_top = False衣洁,詳細(xì)頁(yè)面墓捻,在頁(yè)面上方是否也顯示保存刪除等按鈕
  • inlines,詳細(xì)頁(yè)面坊夫,如果有其他表和當(dāng)前表做FK砖第,那么詳細(xì)頁(yè)面可以進(jìn)行動(dòng)態(tài)增加和刪除
class UserInfoInline(admin.StackedInline): # TabularInline
    extra = 0
    model = models.UserInfo
 
class GroupAdminMode(admin.ModelAdmin):
    list_display = ('id', 'title',)
    inlines = [UserInfoInline, ]
  • 定制HTML模板
add_form_template = None
change_form_template = None
change_list_template = None
delete_confirmation_template = None
delete_selected_confirmation_template = None
object_history_template = None
  • raw_id_fields撤卢,詳細(xì)頁(yè)面,針對(duì)FK和M2M字段變成以Input框形式
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    raw_id_fields = ('FK字段', 'M2M字段',)
  • fields梧兼,詳細(xì)頁(yè)面時(shí)放吩,顯示字段的字段
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    fields = ('user',)
  • exclude,詳細(xì)頁(yè)面時(shí)羽杰,排除的字段
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    exclude = ('user',)
  • readonly_fields渡紫,詳細(xì)頁(yè)面時(shí),只讀字段
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    readonly_fields = ('user',)
  • fieldsets考赛,詳細(xì)頁(yè)面時(shí)惕澎,使用fieldsets標(biāo)簽對(duì)數(shù)據(jù)進(jìn)行分割顯示
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    fieldsets = (
        ('基本數(shù)據(jù)', {
            'fields': ('user', 'pwd', 'ctime',)
        }),
        ('其他', {
            'classes': ('collapse', 'wide', 'extrapretty'),  # 'collapse','wide', 'extrapretty'
            'fields': ('user', 'pwd'),
        }),
    )
  • 詳細(xì)頁(yè)面時(shí),M2M顯示時(shí)欲虚,數(shù)據(jù)移動(dòng)選擇(方向:上下和左右)
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)
  • ordering集灌,列表時(shí)悔雹,數(shù)據(jù)排序規(guī)則
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
   ordering = ('-id',)
   或
   def get_ordering(self, request):
       return ['-id', ]
  • view_on_site复哆,編輯時(shí),是否在頁(yè)面上顯示view on set
view_on_site = False
或
def view_on_site(self, obj):
    return 'https://www.baidu.com'
  • radio_fields腌零,詳細(xì)頁(yè)面時(shí)梯找,使用radio顯示選項(xiàng)(FK默認(rèn)使用select)
radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL
  • show_full_result_count = True,列表時(shí)益涧,模糊搜索后面顯示的數(shù)據(jù)個(gè)數(shù)樣式
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    # show_full_result_count = True # 1 result (12 total)
    # show_full_result_count = False  # 1 result (Show all)
    search_fields = ('user',)
  • formfield_overrides = {}锈锤,詳細(xì)頁(yè)面時(shí),指定現(xiàn)實(shí)插件
from django.forms import widgets
from django.utils.html import format_html
 
class MyTextarea(widgets.Widget):
    def __init__(self, attrs=None):
        # Use slightly better defaults than HTML's 20x2 box
        default_attrs = {'cols': '40', 'rows': '10'}
        if attrs:
            default_attrs.update(attrs)
        super(MyTextarea, self).__init__(default_attrs)
 
    def render(self, name, value, attrs=None):
        if value is None:
            value = ''
        final_attrs = self.build_attrs(attrs, name=name)
        return format_html('<textarea {}>\r\n{}</textarea>',final_attrs, value)
  
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    formfield_overrides = {
        models.models.CharField: {'widget': MyTextarea},
    }
  • prepopulated_fields = {}闲询,添加頁(yè)面久免,當(dāng)在某字段填入值后,自動(dòng)會(huì)將值填充到指定字段扭弧。
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    prepopulated_fields = {"email": ("user","pwd",)}

PS: DjangoAdmin中使用js實(shí)現(xiàn)功能阎姥,頁(yè)面email字段的值會(huì)在輸入:user、pwd時(shí)自動(dòng)填充
  • form = ModelForm鸽捻,用于定制用戶請(qǐng)求時(shí)候表單驗(yàn)證
from app01 import models
from django.forms import ModelForm
from django.forms import fields
 
class MyForm(ModelForm):
    others = fields.CharField()
 
    class Meta:
        model = models = models.UserInfo
        fields = "__all__"
 
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    form = MyForm
  • empty_value_display = "列數(shù)據(jù)為空時(shí)呼巴,顯示默認(rèn)值"
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    empty_value_display = "列數(shù)據(jù)為空時(shí),默認(rèn)顯示"
 
    list_display = ('user','pwd','up')
 
    def up(self,obj):
        return obj.user
    up.empty_value_display = "指定列數(shù)據(jù)為空時(shí)御蒲,默認(rèn)顯示"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衣赶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子厚满,更是在濱河造成了極大的恐慌府瞄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘箍,死亡現(xiàn)場(chǎng)離奇詭異遵馆,居然都是意外死亡续崖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)团搞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)严望,“玉大人,你說(shuō)我怎么就攤上這事逻恐∠裎牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵复隆,是天一觀的道長(zhǎng)拨匆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)挽拂,這世上最難降的妖魔是什么惭每? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮亏栈,結(jié)果婚禮上台腥,老公的妹妹穿的比我還像新娘。我一直安慰自己绒北,他們只是感情好黎侈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著闷游,像睡著了一般峻汉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脐往,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天休吠,我揣著相機(jī)與錄音,去河邊找鬼业簿。 笑死瘤礁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辖源。 我是一名探鬼主播蔚携,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼克饶!你這毒婦竟也來(lái)了酝蜒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矾湃,失蹤者是張志新(化名)和其女友劉穎亡脑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霉咨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蛙紫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片途戒。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坑傅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喷斋,到底是詐尸還是另有隱情唁毒,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布星爪,位于F島的核電站浆西,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏顽腾。R本人自食惡果不足惜近零,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抄肖。 院中可真熱鬧久信,春花似錦、人聲如沸憎瘸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)幌甘。三九已至,卻和暖如春痊项,著一層夾襖步出監(jiān)牢的瞬間锅风,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鞍泉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皱埠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓咖驮,卻偏偏與公主長(zhǎng)得像边器,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子托修,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容