Django admin 管理工具

admin 組件的使用

Django 提供了基於 web 的管理工具。Django 自動管理工具是 django.contrib 的一部分。html

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1.apps.App1Config',
]

admin其實就是一個Django封裝好的app而已。python

admin 組件如何使用:git

例:web

建立一個adminDemo  django 項目時:django

 1.urls.py 文件會自動建立好:session

from django.contrib import admin
from django.urls import path

urlpatterns = [
     path('admin/', admin.site.urls),
   
]

2.settings.py文件中:app

    INSTALLED_APPS=[
  
'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app1.apps.App1Config', #通常建立項目時,會自動建立這句話,但若是是用命令 python manage.py startapp app1 時,不會自動建立這句配置,須要本身手動添加
   #‘app2.apps.App2config’, #或下面那種,直接配置app2
   'app2'
]

3.構建本身的模型類ide

models.py文件中:函數

from django.db import models

# Create your models here.
class Book(models.Model):
    title = models.CharField(max_length=32)
    pub_date = models.DateField()
    price = models.DecimalField(max_digits=5,decimal_places=2)
    #publish表和BOOK表爲一對多的表,外鍵關聯
    publish = models.ForeignKey(to="Publish",on_delete=models.CASCADE)
    #BOOK 表和 Author 表爲多對多表,此處會建立第3張表
    authors = models.ManyToManyField(to="Author",db_table="book2authors")

    def __str__(self):
        return self.title


class Publish(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.CharField(max_length=32)

    def __str__(self):

        return self.name

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    #做者表和做者詳情表示一對一的關係
    ad = models.OneToOneField(to="AuthorDetail",null=True,on_delete=models.CASCADE)
    def __str__(self):
        return self.name


class AuthorDetail(models.Model):

    birthday = models.DateField()
    telephone = models.BigIntegerField()
    addr = models.CharField(max_length=64)

    def __str__(self):
        return str(self.telephone)
models.py

4.在app1(或app2)  admin.py文件中:工具

from django.contrib import admin

# Register your models here.

from .models import Publish,Author,AuthorDetail,Book

from django.utils.safestring import  mark_safe

class Bookconfig(admin.ModelAdmin):
    #自定義列 
    def show_authors(self,obj):
        print(obj.authors.all())

        return ",".join([obj.name for obj in obj.authors.all() ])#做者那列經過循環顯示,用逗號分開
  
#要顯示的列 list_display
= ["title","price","show_authors",'pub_date',"publish"] search_fields = ["title","price"] #按字段搜索 # list_editable = ["price"] #設置某個字段可編輯 list_filter = ["publish"]#經過出版社查或分類,通常一對多和多對多用該方法 ordering = ["-price"] #按價格從大到小排列 # change_list_template = "mylist.html"    #多選批量初始化 def patch_init(self,request,queryset): queryset.update(price=100) patch_init.short_description = "批量初始化" # actions = ["patch_init"] actions = [patch_init] class PublishConfig(admin.ModelAdmin): list_display = ["name","city",'email'] list_display_links = ["city","email"] #默認第一個字段爲超連接, 此處自定義超連接字段

#在admin.py中只須要講Mode中的某個類註冊,便可在Admin中實現增刪改查的功能 #註冊admin.site admin.site.register(Book,Bookconfig) admin.site.register(Author) admin.site.register(AuthorDetail) admin.site.register(Publish,PublishConfig)

 

5.建立超級管理用戶:

經過命令 python manage.py createsuperuser 來建立超級用戶,設置用戶名,密碼和郵箱,訪問 http://127.0.0.1:8000/admin/,輸入這個帳號和密碼,就能夠進入

admin 給模型類建立好的頁面。

 

輸入剛建立好的超級用戶名和密碼後:

 

admin的定製

在admin.py中只須要講Mode中的某個類註冊,便可在Admin中實現增刪改查的功能,如:

admin.site.register(models.UserInfo)

想要進行更多的定製操做,須要利用ModelAdmin進行操做:

方式一:
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd',)
 
    admin.site.register(models.UserInfo, UserAdmin) # 第一個參數能夠是列表
     
 
方式二:
    @admin.register(models.UserInfo)                # 第一個參數能夠是列表
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd',)

 1. list_display,列表時,定製顯示的列。

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'pwd', 'xxxxx')
 
    def xxxxx(self, obj):
        return "xxxxx"

2. list_display_links,列表時,定製列能夠點擊跳轉

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'pwd', 'xxxxx')
    list_display_links = ('pwd',)

3. list_filter,列表時,定製右側快速篩選

4. list_select_related,列表時,連表查詢是否自動select_related

5. list_editable,列表時,能夠編輯的列 

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'pwd','ug',)
    list_editable = ('ug',)

6. search_fields,列表時,模糊搜索的功能

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
     
    search_fields = ('user', 'pwd')

7. date_hierarchy,列表時,對Date和DateTime類型進行搜索

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    date_hierarchy = 'ctime'

8  inlines,詳細頁面,若是有其餘表和當前表作FK,那麼詳細頁面能夠進行動態增長和刪除

 
class UserInfoInline(admin.StackedInline): # TabularInline
    extra = 0
    model = models.UserInfo
 
 
class GroupAdminMode(admin.ModelAdmin):
    list_display = ('id', 'title',)
    inlines = [UserInfoInline, ]
 

9 action,列表時,定製action中的操做

 
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    # 定製Action行爲具體方法
    def func(self, request, queryset):
        print(self, request, queryset)
        print(request.POST.getlist('_selected_action'))
 
    func.short_description = "中文顯示自定義Actions"
    actions = [func, ]
 
    # Action選項都是在頁面上方顯示
    actions_on_top = True
    # Action選項都是在頁面下方顯示
    actions_on_bottom = False
 
    # 是否顯示選擇個數
    actions_selection_counter = True
 

10 定製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

11 raw_id_fields,詳細頁面,針對FK和M2M字段變成以Input框形式

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    raw_id_fields = ('FK字段', 'M2M字段',)

12  fields,詳細頁面時,顯示字段的字段

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    fields = ('user',)

13 exclude,詳細頁面時,排除的字段

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    exclude = ('user',)

14  readonly_fields,詳細頁面時,只讀字段

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    readonly_fields = ('user',)

15 fieldsets,詳細頁面時,使用fieldsets標籤對數據進行分割顯示

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    fieldsets = (
        ('基本數據', {
            'fields': ('user', 'pwd', 'ctime',)
        }),
        ('其餘', {
            'classes': ('collapse', 'wide', 'extrapretty'),  # 'collapse','wide', 'extrapretty'
            'fields': ('user', 'pwd'),
        }),
    )
 

16 詳細頁面時,M2M顯示時,數據移動選擇(方向:上下和左右)

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)

17 ordering,列表時,數據排序規則

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    ordering = ('-id',)
    或
    def get_ordering(self, request):
        return ['-id', ]

18. radio_fields,詳細頁面時,使用radio顯示選項(FK默認使用select)

radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL

19 form = ModelForm,用於定製用戶請求時候表單驗證

 
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
 

20 empty_value_display = "列數據爲空時,顯示默認值"

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    empty_value_display = "列數據爲空時,默認顯示"
 
    list_display = ('user','pwd','up')
 
    def up(self,obj):
        return obj.user
    up.empty_value_display = "指定列數據爲空時,默認顯示"

 

例子2:admin.py中:

from django.contrib import admin

# Register your models here.
#導入當前文件夾中,某文件中的類

from .models import Book,Publish,AuthorDetail,Author
from django.utils.safestring import  mark_safe
#admin 的定製 ,
class Bookconfig(admin.ModelAdmin):


    def show_authors(self,obj):
       return [obj.name for obj in obj.authors.all()]


    list_display_links = ["price",]

    def delbtn(self):
        return "刪除"
    def a_link(self):
        return "<a>刪除</a>"

    def b_link(self):
        return mark_safe("<a>刪除</a>")

    list_display = ["title", "price", "publish", "pub_date", "show_authors",delbtn,a_link,b_link]  # 展示書的名字



#給模型類注admin
admin.site.register(Book,Bookconfig)
admin.site.register(Publish)
admin.site.register(Author)
admin.site.register(AuthorDetail)

效果:

 

知識點補充:

from app1 import models
1.models.Book._meta.model_name
獲得模型類 名的小寫:'book'
2.models.Book._meta.app_label
獲得模型類所在app 小寫名 :'app1'

 

admin 組件源碼解析過程:

admin源碼解析:
                1 啓動全部app下的admin.py文件
                        autodiscover_modules('admin', register_to=site)
                2 註冊模型類
                
                        admin.site: AdminSite的單例對象
                        admin.site.register(Book,BookConfig)
                        admin.site.register(Author)
                        
                        
                        class ModelAdmin():
                              pass
                        
                        
                        class AdminSite():
                             
                             def __init():
                                  self._registry = {}  # model_class class -> admin_class instance
                             

                            def register(self, model_or_iterable, admin_class=None):
                                  admin_class = admin_class or ModelAdmin
                                  self._registry[model] = admin_class(model, self)
                                  
                                                            
          
                
                3 基於二級分發設計url路由
                       path('index/', views.index),
                       path('index/',([
                              path('test01/', test01),
                              path('test02/', test02),
                                   ],None,None)),
                                   
                                   
                                   
                         # 二級分發

                        path('index/',([
                                      path('name/', ([
                                                       path('alex/', test01),
                                                       path('egon/', test02),
                                                       ],None,None)),
                                      path('shop/', ([
                                                         path('apple/',  test03),
                                                         path('xiaomi/', test04),
                                                         path('huawei/', test05),
                                                       ],None,None)),
                                           ],None,None)),  

 二級分發的應用:

初始 分發原理:

  path("index",視圖函數)或

  path( "index" , ( get_urls(), None , None) )


#admin 中 的:
def get_urls():   tmp =[ ]   for model, config_obj in admin.site._registry.items():     model_name=model._meta.model_name     app_label = model._meta.app_label     tmp.append(         path("%s/%s/"%(app_label,model_name),config_obj.urls)       )   return tmp #增刪改查視圖函數,此函數能夠放在 模型類對應的配置類中放此函數 def get_urls(self):   tmp=[   path(" " ,self.list_view ),   path("add/'',self.add_view),   path( "(\d+)/change/" , self.change_view )   path( "(\d+)/delete/", self.delete_view )    ]   return tmp

@property
def urls(self):
  return self.get_urls(),NOne,None)   

 

相關文章
相關標籤/搜索