• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Django 之 admin管理工具

    admin組件的使用

    Django 提供了基于 web 的管理工具。

    Django 自動管理工具是 django.contrib 的一部分。你可以在項目的 settings.py 中的 INSTALLED_APPS 看到它:

    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        "app01"
    ]

    django.contrib是一套龐大的功能集,它是Django基本代碼的組成部分。

    **管理工具

    通常我們在生成項目時會在 urls.py 中自動設置好,

    from django.conf.urls import url
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
    ]

    當這一切都配置好后,Django 管理工具就可以運行了。

    使用管理工具

    啟動開發服務器,然后在瀏覽器中訪問 http://127.0.0.1:8000/admin/,得到登陸界面,你可以通過命令 python manage.py createsuperuser 來創建超級用戶。

    為了讓 admin 界面管理某個數據模型,我們需要先注冊該數據模型到 admin

    from django.db import models
    
    # Create your models here.
    
    
    
    
    class Author(models.Model):
    
        name=models.CharField( max_length=32)
        age=models.IntegerField()
    
    
        def __str__(self):
            return self.name
    
    class Publish(models.Model):
    
        name=models.CharField( max_length=32)
        email=models.EmailField()
    
        def __str__(self):
            return self.name
    
    
    class Book(models.Model):
    
        title = models.CharField( max_length=32)
        publishDate=models.DateField()
        price=models.DecimalField(max_digits=5,decimal_places=2)
    
        publisher=models.ForeignKey(to="Publish")
        authors=models.ManyToManyField(to='Author')
    
        def __str__(self):
            return self.title

    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',)

    ModelAdmin中提供了大量的可定制功能,如:

    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 = "指定列數據為空時,默認顯示"
    from django.contrib import admin
    
    # Register your models here.
    
    from .models import *
    
    
    
    
    class BookInline(admin.StackedInline): # TabularInline
        extra = 0
        model = Book
    
    class BookAdmin(admin.ModelAdmin):
    
        list_display = ("title",'publishDate', 'price',"foo","publisher")
        list_display_links = ('publishDate',"price")
        list_filter = ('price',)
        list_editable=("title","publisher")
        search_fields = ('title',)
        date_hierarchy = 'publishDate'
        preserve_filters=False
    
        def foo(self,obj):
    
            return obj.title+str(obj.price)
    
    
    
        # 定制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
    
    
    
        change_list_template="my_change_list_template.html"
    
    
    
    class PublishAdmin(admin.ModelAdmin):
         list_display = ('name', 'email',)
         inlines = [BookInline, ]
    
    
    
    admin.site.register(Book, BookAdmin) # 第一個參數可以是列表
    admin.site.register(Publish,PublishAdmin)
    admin.site.register(Author)

    admin源碼解析

    單例模式

    單例模式(Singleton Pattern)是一種常用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。
     
    比如,某個服務器程序的配置信息存放在一個文件中,客戶端通過一個 AppConfig 的類來讀取配置文件的信息。如果在程序運行期間,有很多地方都需要使用配置文件的內容,也就是說,很多地方都需要創建 AppConfig 對象的實例,這就導致系統中存在多個 AppConfig 的實例對象,而這樣會嚴重浪費內存資源,尤其是在配置文件內容很多的情況下。事實上,類似 AppConfig 這樣的類,我們希望在程序運行期間只存在一個實例對象。

    在 Python 中,我們可以用多種方法來實現單例模式:

    • 使用模塊
    • 使用 __new__
    • 使用裝飾器(decorator)
    • 使用元類(metaclass)

    使用 __new__

    為了使類只能出現一個實例,我們可以使用 __new__ 來控制實例的創建過程,代碼如下:

    class Singleton(object):
        _instance = None
        def __new__(cls, *args, **kw):
            if not cls._instance:
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  
            return cls._instance  
    
    class MyClass(Singleton):  
        a = 1

    在上面的代碼中,我們將類的實例和一個類變量 _instance 關聯起來,如果 cls._instance 為 None 則創建實例,否則直接返回 cls._instance。
    執行情況如下:

    >> one = MyClass()
    >>> two = MyClass()
    >>> one == two
    True
    >>> one is two
    True
    >>> id(one), id(two)
    (4303862608, 4303862608)

    使用模塊

    其實,Python 的模塊就是天然的單例模式,因為模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。因此,我們只需把相關的函數和數據定義在一個模塊中,就可以獲得一個單例對象了。如果我們真的想要一個單例類,可以考慮這樣做:

    # mysingleton.py
    class My_Singleton(object):
        def foo(self):
            pass
    
    my_singleton = My_Singleton()

    將上面的代碼保存在文件 mysingleton.py 中,然后這樣使用:

    from mysingleton import my_singleton
    
    my_singleton.foo()

    admin執行流程

    <1> 循環加載執行所有已經注冊的app中的admin.py文件

    def autodiscover():
        autodiscover_modules('admin', register_to=site)

    <2> 執行代碼

    #admin.py
    
    class BookAdmin(admin.ModelAdmin):
        list_display = ("title",'publishDate', 'price')
    
    admin.site.register(Book, BookAdmin) 
    admin.site.register(Publish)

    <3> admin.site
    這里寫圖片描述
    這里應用的是一個單例模式,對于AdminSite類的一個單例模式,執行的每一個app中的每一個admin.site都是一個對象。

    <4> 執行register方法

    admin.site.register(Book, BookAdmin) 
    admin.site.register(Publish)
    class ModelAdmin(BaseModelAdmin):pass
    
    def register(self, model_or_iterable, admin_class=None, **options):
        if not admin_class:
                admin_class = ModelAdmin
        # Instantiate the admin class to save in the registry
        self._registry[model] = admin_class(model, self)

    思考:在每一個app的admin .py中加上print(admin.site._registry),執行結果?
    到這里,注冊結束!

    <5> admin的URL配置

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    ]
    class AdminSite(object):
    
         def get_urls(self):
            from django.conf.urls import url, include
    
            urlpatterns = []
    
            # Add in each model's views, and create a list of valid URLS for the
            # app_index
            valid_app_labels = []
            for model, model_admin in self._registry.items():
                urlpatterns += [
                    url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
                ]
                if model._meta.app_label not in valid_app_labels:
                    valid_app_labels.append(model._meta.app_label)
    
    
            return urlpatterns
    
        @property
        def urls(self):
            return self.get_urls(), 'admin', self.name

    <6> url()方法的擴展應用

    from django.shortcuts import HttpResponse
    def test01(request):
        return HttpResponse("test01")
    
    def test02(request):
        return HttpResponse("test02")
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^yuan/', ([
                        url(r'^test01/', test01),
                        url(r'^test02/', test02),
    
                        ],None,None)),
    
    ]

    擴展優化

    from django.conf.urls import url,include
    from django.contrib import admin
    
    from django.shortcuts import HttpResponse
    
    def change_list_view(request):
        return HttpResponse("change_list_view")
    def add_view(request):
        return HttpResponse("add_view")
    def delete_view(request):
        return HttpResponse("delete_view")
    def change_view(request):
        return HttpResponse("change_view")
    
    def get_urls():
    
        temp=[
            url(r"^{0}/{1}$".format(app_name,model_name),change_list_view),
            url(r"^{0}/{1}add/$".format(app_name,model_name),add_view),
            url(r"^{0}/{1}\d+/del/$".format(app_name,model_name),delete_view),
            url(r"^{0}/{1}\d+/change/$".format(app_name,model_name),change_view),
        ]
    
        return temp
    
    
    url_list=[]
    
    for model_class,obj in admin.site._registry.items():
    
        model_name=model_class._meta.model_name
        app_name=model_class._meta.app_label
    
        # temp=url(r"{0}/{1}/".format(app_name,model_name),(get_urls(),None,None))
        temp=url(r"{0}/{1}/".format(app_name,model_name),include(get_urls()))
        url_list.append(temp)
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^yuan/', (url_list,None,None)),
    ]
    版權聲明:本文為u010525694原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/u010525694/article/details/82528974

    智能推薦

    Python3:Django Admin 管理工具的使用(簡單的使用)

    1.前言 前面通過學習創建了一個基本的映射:Python3:使用Django創建web應用出現的坑(Django Admin 管理工具的使用),下面的都是基于這個實現的操作!!! 學習來源:菜鳥教程 2.實現修改和顯示當前頁面的字段 在當前的webapp中的admin.py模塊中添加以下內容: 結果: 1.結論當前的字段是通過admin.site.register(Contact, Contact...

    Django框架入門七__Admin管理工具的使用

    什么是Admin管理工具呢,管理工具就是給一項技術提供一個可管理的頁面,比如說 Elasticsearch 就提供了管理工具 head-master ,我們可以通過管理工具去管理此軟件 那么Django 提供了基于 web 的管理工具,Django 自動管理工具是 django.contrib 的一部分,下面就來介紹 Django 的管理工具 文章目錄 1. 配置Admin 1.1 添加配置文件內...

    Django后臺管理工具xadmin

    1、先創建一個Django項目 2、進入虛擬環境安裝xadmin Django2的pip安裝 3、(推薦)也可以直接源文件作為一個app使用。先到github下載源文件,把里面的xadmin文件夾直接放到extra_apps里, 這樣的話要安裝依賴項: 安裝好后,要設置一下settings,在里面添加以下三行代碼: 4、可以使用xadmin了,在settings中添加兩個app 5、為了方便展示x...

    Python3:使用Django創建web應用出現的坑(Django Admin 管理工具的使用)

    1.sqlite3中沒有角色和權限表 由于本人創建了一個Django項目,它默認使用的數據庫為sqlite3,但是又有一個admin的界面:http://127.0.0.1:8000/admin/,登錄出現錯誤,發現是當前的sqlite3中沒有任何的數據存在,也不存在任何的表,下面是解決辦法 1.使用命令行切換到當前的項目下于當前的manage.py同級 2.使用命令:python manage....

    dubbo管理工具之dubbo-admin安裝使用

    dubbo管理工具之dubbo-admin安裝使用 dubbo-admin-develop介紹 dubbo-admin-develop 下載 dubbo-admin-develop項目部署 啟動流程 訪問dubbo-admin dubbo-admin-develop介紹 dubbo-admin-develop是Dubbo RPC框架的“管理端”,可以對注冊的服務(provi...

    猜你喜歡

    包管理工具之Yum

    Yum(全稱為 Yellow dog Updater, Modified)是基于RPM包的包管理工具,能夠從指定的服務器自動下載RPM包并且安裝,可以自動處理依賴性關系,并且一次安裝所有依賴的軟件包,無須繁瑣地一次次下載、安裝。至于RPM的介紹,請參考 https://blog.51cto.com/marvin89/2107904 yum簡單流程圖: yum配置文件查看 配置文件分2端 配置以ce...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡